[Java] 람다(Lambda) 표현식
Java의 익명 함수, 그리고 가독성을 높이는 축약형
람다 표현식과 그의 축약형인 메서드 참조에 대해 알아보자.
람다(Lambda) 표현식
- 함수형 프로그래밍을 구성하기 위한 함수 식
- 메소드를 간결한 함수의 식으로 표현
- 익명 함수(anonymous function)라고도 함.
람다의 구조
- 람다 파라미터
- Parameter 타입 생략 가능
- Parameter가 하나일 때
()
생략 가능
- 화살표
- 람다 바디
- 실행 내용이 단일 일 때
{}
생략 가능 (단,return
,;
도 함께 생략)
- 실행 내용이 단일 일 때
람다 예시
- Boolean 표현식
(List<String> list) -> list.isEmpty()
- 객체 생성
() -> new Apple(10)
- 두 값을 조합
(int a, int b) -> a * b
메서드 참조(Method References)
- Java 8의 새로운 기능
- 특정 메서드만 호출하는 람다의 축약형
- 효과 : 가독성 증대
메서드 참조 종류
종류 | 람다 표현식 | 메서드 참조 |
---|---|---|
정적 메서드 참조 | (x) -> ClassName.method(x) |
ClassName::method |
인스턴스 메서드 참조 | (x) -> obj.method(x) |
obj::method |
매개변수의 메서드 참조 | (obj, x) -> obj.method(x) |
ClassName::method |
매개변수의 메서드 참조 | (x, y) -> new ClassName(x, y) |
ClassName::new |
- 정적 메서드 참조
메서드 참조 ::
기호 앞부분에 Class 명을 그대로 기재
Function<String, Integer> stringToInt;
stringToInt = (s) -> Integer.parseInt(s); // 람다 표현식
stringToInt = Integer::parseInt; // 메서드 참조
stringToInt.apply("100");
- 인스턴스 메서드 참조
메서드 참조 ::
기호 앞부분에 상단에 선언한 인스턴스 변수를 기재
ArrayList<Number> list = new ArrayList<>();
Consumer<Collection<Number>> addElements;
addElements = (arr) -> list.addAll(arr); // 람다 표현식
addElements = list::addAll; // 메서드 참조
- 매개변수의 메서드 참조
메서드 참조 ::
기호 앞부분에 매개 변수의 Class 타입명을 기재
Function<String, Integer> size;
size = (String str) -> str.length(); // 람다 표현식
size = String::lengh; // 메서드 참조
size.apply("Hello World"); // 11
- 생성자 참조
Supplier<Apple> c1 = () -> new Apple(); // 람다 표현식
Supplier<Apple> c1 = Apple::new; // 메서드 참조
Apple a1 = c1. get();