Lambda

류기탁·2021년 12월 13일
0

Java

목록 보기
2/5

Lambda

가. 배경

어떤 인터페이스가 존재한다. 이 인터페이스는 추상 메소드가 단 한개만 존재한다.
이 인터페이스를 'Functional Interface' 라고 한다.
특별한 기능 '한 가지'를 위해 존재하는 인터페이스인 것이다.
누군가 이 인터페이스를 필요로 한다면( 구현 OR 사용을 한다면 ), 누군가는 단 하나만 신경쓰면 된다.
컴파일러는, 이미 인터페이스를 쓰는 것을 알고 있다. 그래서, 결과도 이미 예측을 하고 있다.
그래서 빨리 작성할 수 있게 도와준다. 그것이 Lambda 인 것이다.

  • 인터페이스 코드
@FunctionalInterface
public interface MyFuncIF {
	int calc(int i, int j);
}

나. 람다(lambda)식

람다식은 메소드를 하나의 식(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);

다. 람다식 작성하기

  1. 메소드에서 이름과 반환타입을 제거한다
  2. 매개변수 선언부와 몸통 {} 사이에 -> 를 추가한다.
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문일 경우 생략할 수 없다.

라. 몇 가지 람다식 예

  • MAX
/// 메소드 
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;
}

마. 우선순위 큐 / ArrayList 정렬 시 사용하는 람다식 (2022.01.10 Update)

// 0인덱스에 대해 오름차순
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
profile
오늘도 행복한 하루!

0개의 댓글