어떤 인터페이스가 존재한다. 이 인터페이스는 추상 메소드가 단 한개만 존재한다.
이 인터페이스를 'Functional Interface' 라고 한다.
특별한 기능 '한 가지'를 위해 존재하는 인터페이스인 것이다.
누군가 이 인터페이스를 필요로 한다면( 구현 OR 사용을 한다면 ), 누군가는 단 하나만 신경쓰면 된다.
컴파일러는, 이미 인터페이스를 쓰는 것을 알고 있다. 그래서, 결과도 이미 예측을 하고 있다.
그래서 빨리 작성할 수 있게 도와준다. 그것이 Lambda 인 것이다.
@FunctionalInterface
public interface MyFuncIF {
int calc(int i, int j);
}
람다식은 메소드를 하나의 식(expression)으로 표현한 것이다.
함수를 간략하면서 명확하게 표현할 수 있게 해준다.
메소드의 이름과 반환값이 없어지므로, 람다식을 익명함수라고도 한다
int[] arr = new int[5];
int method(int i){
return (int)(Math.random() * 5 + 1);
}
//를 다음과 같이 표현 할 수 있다.
Arrays.setAll(arr, (i) -> (int) (Math.random()*5) + 1);
int max(int a, int b){
return a > b ? a : b;
}
를 다음과 같이 바꿀 수 있다.
(int a, int b) -> return a > b ? a : b;
위와 같이return 이 있는 메소드의 경우, return을 식으로 대신할 수 있다.
식의 연산결과가 자동적으로 반환된다. 문장이 아닌 식이므로 ;를 붙이지 않는다.
(int a, int b) -> a > b ? a : b
람다식의 매개변수 타입은 추론이 가능한 경우에는 생략 할 수 있다.
대부분 생략이 가능하다.
(a,b) -> a > b ? a : b
만약 매개변수가 하나 뿐인 경우에는 ()를 생략할 수 있다. 타입이있으면 생략이 불가하다.
( a ) -> a * a
//를
a -> a * a
//로 바꿀 수 있다.
마찬가지로, {}안의 문장이 하나일 때는 생략할 수 있다. 단, return문일 경우 생략할 수 없다.
/// 메소드
int max(int a, int b){
return a > b ? a : b;
}
/// 람다식
(a,b) -> a > b ? a : b;
/// 메소드
void printVar(String name, int i){
System.out.println(name + "=" + i);
}
/// 람다식
(name , i ) -> System.out.println(name + "=" + i);
/// 메소드
int square(int x){
return x * x;
}
/// 람다식
x -> x * x;
/// 메소드
int sumArr(int[] Arr){
int sum = 0;
for(int i : Arr) sum += i;
return sum;
}
/// 람다식
(int[] Arr) -> {
int sum = 0;
for(int i : Arr) sum += i;
return sum;
}
// 0인덱스에 대해 오름차순
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);