goal
java의 lambda를 이해한다.
1 ] 람다(Lambda)의 개념과 기본 사용법
- java의 람다는 함수 지향 언어에 가깝다.
- 람다식의 형태는 매개변수를 가진 코드 블록이지만, 런타임에 익명 구현 객체를 생성한다.
- 메소드를 하나의 식으로 표현한 것을 의미한다.
- 람다식은 익명 함수라고도 한다.
[1] 람다 사용의 이점
- 코드가 매우 간결해짐
- 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽계 집계
맛보기
- 전형적인 익명 구현 객체의 생성
Runnable runnable = new Runnable() {
public void run() {......}
}
- 람다식으로 익명 구현 객체를 표현
Runnable runnable = () -> {...};
[2] 람다식의 기본 문법
- 기본 사용방법
// 1. (타입 매개변수,...) -> {실행문;}
(int a)->{System.out.println(a);}
- 매개변수가 한 개일 때의 좌측 식의 소괄호 생략
// 2. 매개변수가 한 개일 때 앞의 소괄호() 생략이 가능하다.
// └ 매개변수 -> {실행문;}
a -> {System.out.println(a);}
- 실행문이 한 개일 경우 {실행문;}의
중괄호{ }
도 생략이 가능하다.
a -> System.out.println(a);
- return값을 가지는 람다
(x + y) -> {return x + y;}
- 만약,
중괄호{실행문}
안에 return만 가질 경우, return을 생략하고 쓰는 것이 일반적
(x + y) -> x + y
2 ] 람다 진짜 진짜 사용하기
많은 블로그를 보면 타켓 타입과 함수형 인터페이스 어쩌고 설명하고있다. 각설하고 바로 사용법을 기술해보겠다.
import java.util.function.IntConsumer;
@FunctionalInterface
interface test {
void print1(int a, int b);
}
public class Note {
public static void main(String[] args) {
test T = (a, b) -> {
System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b));
};
T.print1(2,3);
}
}
/*
-----output-----
lambda처리 - printf1 추상메소드: 5
----------------
*/
- 람다를 사용하기 위해서는 인터페이스를 선언해야하며,
인터페이스 안에는 단 하나의추상 메소드
를 가져야한다. - 람다를 사용하는 구문은 아래와 같다.
test T = (a, b) -> {
System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b));
};
T.print1(2,3);
람다 사용의 주의 및 알아두면 괜찮을 것들
- (주의점) : 람다를 사용하는 인터페이스 안에 두 개의 추상메소드를 가지면 오류가 난다.
- (알아두기) :
@FuntionalInterface
가 없더라도 람다식을 구현해도 잘 작동한다. (메타 데이터 기술부라 생각)
람다를 사용하며 의문이 들었던 것
람다를 사용하는 인터페이스 안에 두 개의 메소드를 가지면 안될까?
정확하지는 않으나 Jaranun님 께서의 첨언과 나의 생각을 더해 생각해보면 추상메소드가 두 개 이상이라면 아래 코드의 부분에서
test T = (a, b) -> {
System.out.printf("lambda처리 - printf1 추상메소드: %d", (a+b));
};
객체가 생성되어질 때 컴파일러는 method-target
이 어떤 것인지 정확하게 모른다.
이러한 이유로 람다식을 사용하는 인터페이스에서는 하나의 추상메소드만 가져야한다.