[JAVA] 람다식
람다식
- 인터페이스를 구현하는 익명 클래스의 객체 생성 부분을 수식화한 것
- 인터페이스가 1개의 추상 메소드만 가진 경우 표현 가능
- 이러한 인터페이스를 함수형 인터페이스라고 함
- 메소드가 1개 뿐이므로 메소드 이름 생략 가능
- 화살표 함수를 사용하여
인터페이스 객체변수 = (매개변수목록) -> {실행문목록};
형식으로 표현
1
2
3
4
5
Runnable runnable = new Runnable() {
public void run() {...}
};
//람다식으로 표현
Runnable runnable = () -> {...};
람다식의 기본 문법
- 람다식의 결과 타입을 타깃 타입(인터페이스)이라고 함
- 람다식의 매개변수의 자료형은 타깃 타입 정의에서 추론할 수 있으므로 생략 가능
- 람다식의 매개변수가 1개면 괄호를 생략 가능하고, 매개변수가 없다면 괄호만 사용
- 람다식의 실행문 목록에서 실행문이 1개이면 중괄호 생략 가능
Runnable runnable = () -> System.out.println("my thread");
- 만약 실행문이 return문 뿐이면 중괄호와 return까지 생략 가능
f1 = (a, b) -> { return a+b; };
=>f1 = (a, b) -> a+b;
1
2
3
4
5
6
7
8
9
10
11
12
13
Addable ad = new Addable() {
public int add(int a, int b) {
return (a + b);
}
};
// 매개변수 자료형과 return문을 포함한 람다식
Addable ad = (int a, int b) {
return (a + b);
};
// 매개변수 자료형과 return문을 생략한 람다식
Addable ad = (a, b) -> (a + b);
함수형 인터페이스
- 1개의 추상 메소드만 가지는 인터페이스
- 함수형 인터페이스를 구현하는 클래스를 정의할 때, 익명 클래스로 정의하는 것보다 람다식을 사용하는 것이 효율적
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 함수형 인터페이스가 될 수 있다.
interface IAdd {
int add(int x, int y);
}
// 함수형 인터페이스가 될 수 없다.
interface ICalculate {
int add(int x, int y);
int min(int x, int y);
}
// 구성요소가 많아도 결국 추상 메소드는 한 개이기 때문에 함수형 인터페이스이다.
interface IAdd {
int add(int x, int y); // 추상 메소드
final boolean isNumber = true; // final 상수
default void print() {}; // 디폴트 메소드
static void print2() {}; // static 메소드
}
표준 함수형 인터페이스
- java.util.function 패키지에서 표준 함수형 인터페이스가 제네릭 인터페이스로 제공됨
Consumer<T>
:void accept(T t)
메소드를 가짐Supplier<T>
:T get()
메소드를 가짐Function<T, R>
:R apply(T t)
메소드를 가짐
1
2
3
4
5
Supplier<Integer> rand = () -> {
Integer r = (int) (Math.random() * 10);
return r;
}
int a = rand.get();
참고사이트
This post is licensed under CC BY 4.0 by the author.