LostCatBox

Java 배우기 CH14

Word count: 541Reading time: 3 min
2022/12/23 Share

람다식

람다식(Lambda Expression)

  • 함수(메서드)를 간단한 식(expression)으로 표현하는 방법
  • 익명 함수(이름없는 함수)

Untitled

  • 함수와 메서드의 차이
    • 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향개념 용어
    • 함수는 클래스에 독립적, 메서드는 클래스에 종속적

람다식 작성하기

Untitled

람다식 작성시 주의사항

Untitled

람다식은 익명 함수 X 익명 객체임

  • 람다식도 객체다.

Untitled

  • 하지만 Object obj = new Object() { //내용//} 해도 max()함수 활용을 할수가없다.
  • 이유는 참조변수(리모콘)에 해당 기능이없기때문이다!!!>>따라서 객체 타입변경 및 함수형 인터페이스가 필요함

함수형 인터페이스

  • 람다식을 다루기 위해 사용됨
  • 단 하나의 추상 메서드만 선언된 인터페이스
  • 아래와 같이 클래스의 선언, 객체 생성 동시에 가능
  • 이름 맞춰지는 조건 반드시 기억하기

Untitled

  • 람다식(익명 객체)를 다루기 위한 참조변수의 타입은 함수형 인터페이스로 해야한다.
  • 또한 max()이름이 없는 익명의 람다이므로 반드시 매개변수 갯수, 반환타입 맞쳐야함.
  • 익명의 객체 생성시 MyFunction 인터페이스 구현함.. 따라서 myFunction참조변수 사용가능
  • (a,b) → a>b?a:b 만을 사용하더라도 앞에 참조변수의 타입으로 변경???

함수형 인터페이스 - example

Untitled

  • sort()메서드의 매개변수로 list, Comparator 타입을 바라보고있으므로, 정말 당연하게 람다식으로 쓰면, 개가 Comparator 인터페이스를 상속받은 함수가 되어 처리가능

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@FunctionalInterface
interface MyFunction {
void run(); // public abstract void run();
}

class Ex14_1 {
static void execute(MyFunction f) { // 매개변수의 타입이 MyFunction인 메서드
f.run();
}

static MyFunction getMyFunction() { // 반환 타입이 MyFunction인 메서드
MyFunction f = () -> System.out.println("f3.run()");
return f;
}

public static void main(String[] args) {
// 람다식으로 MyFunction의 run()을 구현
MyFunction f1 = ()-> System.out.println("f1.run()");

MyFunction f2 = new MyFunction() { // 익명클래스로 run()을 구현
public void run() { // public을 반드시 붙여야 함
System.out.println("f2.run()");
}
};

MyFunction f3 = getMyFunction();

f1.run();
f2.run();
f3.run();

execute(f1);
execute( ()-> System.out.println("run()") );
}
}

java.util.function 패키지(1/3)

Untitled

  • 예시

Untitled

java.util.function 패키지(2/3)

Untitled

java.util.function 패키지(3/3)

Untitled

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.function.*;
import java.util.*;

class Ex14_2 {
public static void main(String[] args) {
Supplier<Integer> s = ()-> (int)(Math.random()*100)+1;
Consumer<Integer> c = i -> System.out.print(i+", ");
Predicate<Integer> p = i -> i%2==0;
Function<Integer, Integer> f = i -> i/10*10; // i의 일의 자리를 없앤다.

List<Integer> list = new ArrayList<>();
makeRandomList(s, list);
System.out.println(list);
printEvenNum(p, c, list);
List<Integer> newList = doSomething(f, list);
System.out.println(newList);
}

static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
List<T> newList = new ArrayList<T>(list.size());

for(T i : list) {
newList.add(f.apply(i));
}

return newList;
}

static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
System.out.print("[");
for(T i : list) {
if(p.test(i))
c.accept(i);
}
System.out.println("]");
}

static <T> void makeRandomList(Supplier<T> s, List<T> list) {
for(int i=0;i<10;i++) {
list.add(s.get());
}
}
}

이후 과정생략

이후는 심화학습같은 느낌들어서일단 넘어감

필요시 추후 학습

[https://www.youtube.com/watch?app=desktop&v=Kk1ZIrVZnqw&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=162](

CATALOG
  1. 1. 람다식
    1. 1.1. 람다식(Lambda Expression)
    2. 1.2. 람다식 작성하기
    3. 1.3. 람다식 작성시 주의사항
    4. 1.4. 람다식은 익명 함수 X 익명 객체임
  2. 2. 함수형 인터페이스
    1. 2.1. 함수형 인터페이스 - example
    2. 2.2. java.util.function 패키지(1/3)
    3. 2.3. java.util.function 패키지(2/3)
    4. 2.4. java.util.function 패키지(3/3)
  3. 3. 이후 과정생략