람다 표현식( Lambda Expression ) =익명함수( Anonymous Function )
(int x , int y) -> { x + y }
。JAVA 8에서 추가된 기능으로서함수형 인터페이스 구현체생성 시추상 메서드구현을 간결하게 표현하는 방식
▶구현클래스 객체를 생성 후메서드를 정의할 필요 없이함수형 인터페이스를 통해 간결하게 사용 가능.
。JAVA에서 함수형 프로그래밍을 수행 시함수를 전달하는매개체인인터페이스 구현체를 생성하는 용도로 사용@FunctionalInterface interface StringProcessor{ String process(String s); } // StringProcessor 인터페이스 구현체 생성 StringProcessor processer = (s) -> s.toUpperCase().trim();。 코드에서 단 한번 실행할 목적으로 사용되므로,
코드가 단 한번만 생성되서 활용되므로불변을 보장하므로병렬 프로그래밍에 최적화
。람다식을 축약한 표현으로메소드참조,생성자참조등의 방식이 존재
람다 표현식의 유래
。람다 대수를 기반으로람다 표현식으로 구현한 것
▶람다 대수:함수와함수연산으로추상화한 체계
함수형 인터페이스 구현체를매개변수로 받는메소드에서 주로 활용
。 이를 통해일급객체로서 다른메소드의매개변수로 전달하거나변수에 대입하는 등의 연산이 가능// ex ) 활용예시 PriorityQueue<Integer> pq = new PriorityQueue<>((o1,o2) -> { int i1 = Math.abs(o1); int i2 = Math.abs(o2); if ( i1 == i2 ) { return o1 > o2 ? 1 : -1; // 절댓값이 동일할 경우 음수 우선정렬 } else { return i1 - i2; } });
람다식작성 규칙
매개변수 규칙
。매개변수가 없는 경우,빈괄호 : () ->
。매개변수가 1개인 경우괄호 생략 : a ->
。매개변수가 2개 이상인 경우괄호 생략 불가// 매개변수가 없는 경우 -> 빈괄호 () -> System.out.println("안녕"); // 매개변수가 1개인 경우 - 괄호생략 가능 a -> System.out.println(a); // 매개변수가 2개 이상인 경우 - 괄호생략 불가능 (a,b) -> System.out.println(a+b);
실행코드 규칙
。logic이한 줄이면return과{ }를 생략가능
() - > new 클래스();
▶중괄호가 존재하는 경우return필수// 실행코드가 한 줄인 경우 -> 중괄호 생략 (a,b) -> System.out.println(a+b);
타입 생략규칙
。함수형 인터페이스의메서드에 이미Type을 한정하고 있으므로,컴파일러가타입추론을 자동으로 수행하여람다식 매개변수에Type을 지정하지 않아도된다. :(int a, int b)->=(a,b)->
람다식특징
장점
。코드가 간결
。지연연산수행이 가능
。병렬처리가능
단점
。디버깅이 까다롭다.
。Stream을 통해람다식을 활용하는 경우반복문에서 성능이 저하