[Java] 람다(Lambda) 표현식

Date:

Updated:

Categories:

Tags:


Java의 익명 함수, 그리고 가독성을 높이는 축약형

람다 표현식과 그의 축약형인 메서드 참조에 대해 알아보자.

람다(Lambda) 표현식

  • 함수형 프로그래밍을 구성하기 위한 함수 식
  • 메소드를 간결한 함수의 식으로 표현
  • 익명 함수(anonymous function)라고도 함.

람다의 구조

image

  • 람다 파라미터
    • 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
  1. 정적 메서드 참조

메서드 참조 :: 기호 앞부분에 Class 명을 그대로 기재

Function<String, Integer> stringToInt;

stringToInt = (s) -> Integer.parseInt(s); // 람다 표현식
stringToInt = Integer::parseInt; // 메서드 참조

stringToInt.apply("100");
  1. 인스턴스 메서드 참조

메서드 참조 :: 기호 앞부분에 상단에 선언한 인스턴스 변수를 기재

ArrayList<Number> list = new ArrayList<>();
Consumer<Collection<Number>> addElements;

addElements = (arr) -> list.addAll(arr); // 람다 표현식
addElements = list::addAll; // 메서드 참조
  1. 매개변수의 메서드 참조

메서드 참조 :: 기호 앞부분에 매개 변수의 Class 타입명을 기재

Function<String, Integer> size;

size = (String str) -> str.length(); // 람다 표현식
size = String::lengh; // 메서드 참조

size.apply("Hello World"); // 11
  1. 생성자 참조
Supplier<Apple> c1 = () -> new Apple(); // 람다 표현식
Supplier<Apple> c1 = Apple::new; // 메서드 참조

Apple a1 = c1. get();