Lambda Expression in JAVA
--> 코드가 매우 간결해진다. --> 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해 쉽게 집계
오직 단 하나의 추상메소드를 가진 인터페이스를 의미
인터페이스에 올 수 있는 멤버 4가지 중에 추상메소드(abstract)를 제외한 나머지 멤버는 올 수 있다.
@FunctionalInterface 붙어있는 인터페이스를 의미
(단, 이 어노테이션이 없다고 해서, 추상메소드가 오직 1개 뿐인 인터페이스가 functional이 아닌것은 아니다!)
JAVA는 람다식을 함수적 인터페이스의 익명구현객체로 취급
람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체
Runnable = (매개변수) -> { };
(타입의 매개변수) -> { 실행문 };
(int a) -> {System.out.println(a)};
- 1. 람다식 구현
MyFunctionalInterface fi = () -> {
String str = "method call 1";
log.info(str);
};
- 2.익명구현객체코딩 기법
MyFunctionalInterface fi = new MyFunctionalInterface() {
@Override
public void method() {
String str = "method call 1";
log.info(str);
}//method
};
-3. 구현 클래스에서 구현객체 생성
MyFunctionalInterface fi = new MyFunctionalInterfaceImpl();
- 생략조건 1. 람다식의 중괄호 블록 안에서 수행할 문장이 오직 1개만 있으면, 중괄호 {} 기호 생략 가능!!
fi = () -> log.info("method call 2");
// 문자열 리터럴 값을 바로 대입
// 수행 문장이 1줄 뿐이라 중괄호 기호 생략
- 생략조건 2. 매개변수 선언부의, 각 매개변수의 타입은, 컴파일러의 타입추론 기능에 의해 생략가능하다!!
//추상메서드의 매개변수 int x 의 매개변수타입 int를 생략
fi = (x) -> {
int result = x * 5;
log.info(result);
};
- 생략조건 3. - 매개변수 선언부의 매개변수가 오직 1개이면 () 기호 생략 가능!!
- 단, 매개변수가 0개 즉, 매개변수가 없다면 생략 불가!
fi = x -> log.info(x * 5);
fi = x -> log.info(x * 5);
- 생략조건 4. - 구현할 추상메소드가 리턴타입이 있고, 람다식의 실행문장이 오직 1개이고, 그 실행문장이 값을 반환하는 return 문장이라면 --> return 키워드 조차 생략 !!
- 생략조건4. 적용 전
fi = (x, y) -> { int result = x + y; return result; };
- 생략조건4. 적용 후
fi = (x, y) -> x + y;
- [매개변수] 가 있는 타겟 타입의 추상메소드를 람다식으로 구현 방법
fi = (x) -> {
int result = x * 5;
log.info(result);
};
- [매개변수] 및 [리턴타입]이 있는 타겟 타입의 추상메소드를 람다식으로 구현 방법
fi = (x, y) -> {
int result = x + y;
return result;
};
- 람다식의 실행블록에서 얼마든지, 라이브리를 사용 가능!
// 정적 메소드 sum 생성
public static int sum(int x, int y) {
return (x + y);
}//sum
// 생성한 sum 메소드를 람다식에 적용
fi = (x, y) -> sum(x, y);