Lamda
- 함수적 프로그래밍의 형태로 재사용 가능한 코드 블록
- 기존의 anonymous inner class를 이용한 처리 방식을 간결하게 처리
public static <T> void sort(T [] a, Comparator<? super T> c) {}
- 람다식 사용시 runtime에 람다식이 익명 구현 객체로 변경
public void sortByAnnonymouse() {
Arrays.sort(langs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.comparetTo(o2);
}
});
public void sortByLamda() {
Arrays.sort(langs, (o1, o2) -> o1.compareTo(o2));
}
타겟 타입과 @FunctionallInterface
- 타겟 타입 또는 함수형 인터페이스
- Lambda 식이 할당되는 인터페이스를 Lambda 식의 타겟 타입이라 함
- 타겟 타입은 abstract 메서드는 반드시 하나만 존재해야 함
@FunctionallInterface
- 컴파일러가 하나의 abstract method만 있음을 체크
abstract method
가 2개 이상 존재하는 경우는 여전히 익명의 inner class 사용
기본 Lamda 식
(type variable_name [,---]) -> {실행문;};
- 매개변수의 타입은 런타임 시 대입되는 값에 따라 자동 인식도므로 일반적으로 생략
(msg) -> {System.out.println(msg);};
- 매개변수 및 실행문이 하나일 때는 변수 및 실행문의 괄호 생략 가능
msg -> System.out.println(msg);
- 리턴이 필요할 경우 return 문장 사용
(msg) -> { System.out.println(msg); return msg;};
- 리턴문만 있는 경우 중괄호와 return을 생략할 수 있음
실행 블록에서의 변수 참조
- Lamda 식 내부에서의 this는 외부 클래스의 instance
- 외부 클래의 member 변수 : 접근제한자의 제약 없이 이용 가능
- 외부 클래스의 local 변수 : final 키워드가 추가된 것으로 동작 → read only
public class LamdaVariableTest {
private int instanceMember = 10;
public void useFIMethod(MyFunctionalInterface fi) {
fi.useNumber(1);
}
public void lamdaMethodTest() {
int localVar = 20;
useFIMethod(msg -> {
System.out.printf("this: %s\n", this.getClass().getName());
System.out.printf("멤버 변수 참조: %d\n", this.instanceMember++);
System.out.printf("로컬 변수 참조: %d\n", localVar);
System.out.println(msg++);
System.out.printf("멤버 변수 참조: %d\n", this.instanceMember);
System.out.println(msg++);
});
}
public static void main(String[] args) {
LamdaVariableTest lvt = new LamdaVariableTest();
lvt.lamdaMethodTest();
}
}
멤버 변수 참조: 10
로컬 변수 참조: 20
1
멤버 변수 참조: 11
2
기본 제공 API 종류
- 자주 사용되는 함수적 표준 interface를 java.util.function package에 정의
- 주로 메서드 또는 생성자의 parameter로 Lamda 식을 제공하기 위함
- Consumer 계열
- parameter는 있는데 return 이 없는 형태
- parameter 타입에 따라 다양한 consumer 존재
- Supplier 계열
- parameter는 없는데 return이 있는 형태
- return 타입에 따라 다양한 supplier 존재
- Function 계열
- parameter와 return 값이 있는 형태
- parameter와 return type에 따라 다양한 인터페이스 존재
- Operator 계열
- Function 계열과 유사
- 매개 값을 이용해 특정 연산을 수행 후 동일한 타입으로 리턴 하는 역할 수행
- Predicate 계열
- parameter를 받고 boolean 타입을 리턴
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.