최근에 Java 8에 도입 된 Lambda 표현식을 마스터했습니다. 기능적 인터페이스를 사용할 때마다 항상 기능적 인터페이스를 구현하는 클래스를 작성하는 대신 Lambda 표현식을 사용하는 경향이 있습니다.
이것이 좋은 습관으로 간주됩니까? 또는 기능 인터페이스에 Lambda를 사용하는 것이 적절하지 않은 상황입니까?
최근에 Java 8에 도입 된 Lambda 표현식을 마스터했습니다. 기능적 인터페이스를 사용할 때마다 항상 기능적 인터페이스를 구현하는 클래스를 작성하는 대신 Lambda 표현식을 사용하는 경향이 있습니다.
이것이 좋은 습관으로 간주됩니까? 또는 기능 인터페이스에 Lambda를 사용하는 것이 적절하지 않은 상황입니까?
답변:
람다를 사용하지 않도록 고려해야 할 여러 가지 기준이 있습니다.
priceIsOver100
. x -> x.price > 100
그 이름만큼이나 분명합니다. 나는 그런 이름 isEligibleVoter
이 긴 조건 목록을 대체 한다는 것을 의미합니다 .배 밖으로 가지 마십시오. 소프트웨어는 쉽게 변경됩니다. 확실치 않은 경우에는 두 가지 방법 모두를 쓰고 어느 것이 더 읽기 쉬운 지보십시오.
따라 다릅니다. 다른 장소에서 동일한 람다를 사용하는 것을 발견 할 때마다 인터페이스를 구현하는 클래스 구현을 고려해야합니다. 그러나 익명의 내부 클래스를 사용했다면 람다가 훨씬 낫다고 생각합니다.
Karl Bielefeldt의 답변을 지원하지만 간단한 추가 내용을 제공하고 싶습니다.
허용되는 칼 Bielefeldt 의해 답변 올바른 것입니다. 하나 더 구별 할 수 있습니다.
클래스 내부의 메소드 안에 중첩 된 람다 코드 는 해당 메소드 및 클래스에서 발견 된 효과적으로 최종 변수에 액세스 할 수 있습니다 .
기능 인터페이스를 구현하는 클래스를 작성한다고해서 호출 코드 상태에 직접 액세스 할 수있는 것은 아닙니다.
Java Tutorial 을 인용 하려면 (강조 광산) :
로컬 및 익명 클래스와 마찬가지로 람다 식은 변수를 캡처 할 수 있습니다. 그것들은 둘러싸는 범위의 지역 변수에 동일한 접근 권한을 갖습니다 . 그러나 로컬 및 익명 클래스와 달리 람다 식에는 그림자 문제가 없습니다 (자세한 내용은 그림자 참조). 람다 식의 범위는 어휘 범위입니다. 즉, 상위 유형에서 이름을 상속받지 않거나 새로운 범위의 범위를 도입합니다. 람다 식의 선언은 둘러싼 환경에서와 마찬가지로 해석됩니다.
따라서 긴 코드를 가져와 이름을 지정하면 이점이 있지만 엔 클로징 방법 및 클래스의 상태에 직접 액세스 할 수있는 단순성과 비교하여 무게를 측정해야합니다.
보다:
이것은 nit-picking 일 수 있지만 다른 답변에서 만든 다른 모든 훌륭한 점에는 다음을 추가합니다.
가능하면 방법 참조를 선호 하십시오. 비교:
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);
대
employees.stream()
.map(employee -> employee.getName())
.forEach(employeeName -> System.out.println(employeeName));
방법 참조를 사용하면 일반적으로 중복 및 / 또는 같은 게으른 이름으로 인도하는 람다의 주장 (들)의 이름을 할 필요가 저장 e
또는 x
.