Lambda 표현식은 일반적으로 Java로 해결할 수있는 문제 집합을 변경하지 않지만, 더 이상 어셈블리 언어로 프로그래밍하지 않는 것과 같은 이유로 특정 문제를 쉽게 해결할 수 있도록합니다. 프로그래머의 작업에서 중복 된 작업을 제거하면 삶이 더 쉬워지고, (수동으로) 생성해야하는 코드의 양만큼만 손대지 않았던 작업을 수행 할 수 있습니다.
그러나 람다 식은 단순히 코드 줄을 절약하는 것이 아닙니다. Lambda 표현식을 사용하면 이전에 익명 내부 클래스를 해결 방법으로 사용할 수 있었던 함수 를 정의 할 수 있습니다. 그렇기 때문에 이러한 경우 익명 내부 클래스를 대체 할 수 있지만 일반적으로는 그렇지 않습니다.
특히, 람다 식은 변환 될 기능 인터페이스에 독립적으로 정의되므로 액세스 할 수있는 상속 된 멤버가 없으며 기능 인터페이스를 구현하는 유형의 인스턴스에 액세스 할 수 없습니다. 람다 식 내 this및 super주변의 상황에서와 같은 의미를 가지고, 또한 볼 이 대답 . 또한 주변 컨텍스트의 지역 변수를 숨기는 새 지역 변수를 만들 수 없습니다. 함수를 정의하는 의도 된 작업의 경우 많은 오류 소스를 제거하지만 다른 사용 사례의 경우 기능 인터페이스를 구현하더라도 람다 식으로 변환 할 수없는 익명 내부 클래스가있을 수 있음을 의미합니다.
또한,이 구조 new Type() { … }는 new항상 그렇듯이 새로운 고유 한 인스턴스를 생성하도록 보장합니다 . 익명의 내부 클래스 인스턴스는 비 static컨텍스트 에서 생성 된 경우 항상 외부 인스턴스에 대한 참조를 유지합니다 . 대조적으로, 람다 식은 this필요할 때 (예 : 액세스 this또는 비 static멤버)에 대한 참조 만 캡처합니다 . 또한 의도적으로 지정되지 않은 ID의 인스턴스를 생성하여 구현시 기존 인스턴스를 재사용할지 여부를 런타임에 결정할 수 있습니다 (“ 람다식이 실행될 때마다 힙에 개체를 생성합니까? ”참조).
이러한 차이점은 귀하의 예에 적용됩니다. 익명의 내부 클래스 구성은 항상 새 인스턴스를 생성하고 외부 인스턴스에 대한 참조를 캡처 할 수있는 반면, (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())일반적인 구현에서 싱글 톤으로 평가되는 비 캡처 람다 표현식입니다. 또한 .class하드 드라이브에 파일을 생성하지 않습니다 .
의미론과 성능의 차이를 감안할 때, 람다 식은 프로그래머가 미래에 특정 문제를 해결하는 방식을 바꿀 수 있습니다. 물론 새로운 언어 기능을 활용하는 함수형 프로그래밍의 아이디어를 수용하는 새로운 API 덕분입니다. Java 8 람다 표현식 및 일류 값을 참조하십시오 .
(o1, o2) -> o1.getName().compareTo(o2.getName())