본 문서는 2021년 12월 23일 에 작성되었습니다.
만약 당신이 하나의 메서드(함수) 만을 객체화(인스턴스화) 하고 싶다면 어떤 방법이 있을까?
예전에서는 추상 메서드를 하나만 담은 인터페이스(추상 클래스) 를 사용했다.
이런 인터페이스의 객체를 함수 객체(function object) 라고 하며 특정 함수나 동작을 나타내는 데 썼다.
이후 jdk 1.1 이 나오면서 이를 익명 클래스, 익명객체 라고 하였다.
그러나 이러한 방식은 생각보다 코그다 길어서 불편했다.
이후 jdk 1.8 이 나오면서 이를 Lamda 식 이라고 부르게 되었다.
본문은 이러한 Lamda 식에 대한 이야기를 다루고 있다.
원제목 | 익명 클래스보다 람다를 사용하라
일반적인 단순 메서드의 기능은 람다식을 사용하자.
그러나 아래의 경우에는 람다식을 사용하지 말아야 한다.
2번과 3번의 경우 익명클 클래스를 사용하도록 하자.
4번의 경우 private 정적 중첩 클래스 (Comparator) 를 사용하자.
원제목 | 람다보다는 메서드 참조를 사용하라
Java : Lamda 중 Method Reference 을 참고하자
아이템 42 | Lamda 권고 에서도 알수 있듯이, 람다식은 간결함을 추구한다.
아이템 43 | :: 권고 에서도 메서드 참조는 간결함을 추구한다고 말한다.
본 도서에서는 아래와 같이 표현하고 있다.
일반적으로 메서드 참조가 더 간결하니 메서드 참조를 사용하되,
그렇지 않은 경우에는 람다식을 통해서 표현하자.유일한 예외는 261p 를 참고하자.
하지만 이러한 다양한 문법의 혼재는 읽는 이를 배려하지도 않고
문맥 전체의 혼란을 야기할 수 있지 않을까 라는 걱정을 한다.
그럼에도 불구하고 혼용해야 한다면,
Integer 클래스등의 대중적인 메서드 선에서 만족해야 하지 않을까 싶다.
map.merge(key, 1, (count, incr) -> count + incr));
map.merge(key, 1, Integer::sum);
Method References 의 종류는 다음과 같다.
메서드 참조 유형 | 메서드 참조 코드 | 람다식 코드 |
---|---|---|
정적 | Integer::parseInt | str -> Integer.parseInt(str); |
한정적 | Integer.now()::isAfter | Instnt them=Instant.now(); t -> then.isAfter(t); |
비한정적 | String::toLowerCase | str -> str.toLowerCase() |
클래스 생성자 | TreeMap<K,V>::new | () -> new TreeMap<K,V>() |
배열 생성자 | int[]::new | len -> new int[len] |
다음과 같은 내용은 차후에 알아보는 것으로 멈춰두었다.