Open injoon2019 opened 2 years ago
람다식으로 메서드를 간결하게 표현할 수 있다. 하지만 람다식의 하나의 메서드만 호출하는 경우에는 메서드 참조로 람다식을 더 간략히 할 수 있다.
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
// 메서드 참조
Function<String, Integer> f = Integer::parseInt;
람다식의 일부가 생략됐는데 컴파일러가 우변의 선언부, 또는 좌변의 인터페이스에서 지네릭 타입으로부터 알아낸다.
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f = String::equals;
클래스 이름을 반드시 붙여줘야 하는데, 다른 클래스에도 동일한 이름의 메서드가 있을 수 있기 때문이다.
str -> Integer.parseInt(str);
Integer::parseInt
2, 3. 인스턴스 메서드 참조
Instant then = Instant.now();
t -> then.isAfter(t);
Instant.now()::isAfter
참조 대상 인스턴스를 한정했다해서 한정적 인스턴스 메서드 참조라 부른다.
str -> str.toLowerCase()
String::toLowerCase
비한정적 인스턴스 메서드 참조
클래스 생성자
() -> new TreeMap<K,V>()
TreeMap<K,V>::new
배열 생성자
len -> new int[len]
int[]::new
만약 매개변수 이름이 드러나는게 가독성이 더 좋거나, 람다가 더 간결한 경우 람다를 쓰자.
service.execute(GoshThisClassNameIsHumongous::action); // 메서드 참조
service.execute(() -> action());
위의 경우 확실히 람다식이 훨씬 가독성이 좋다.
문제
메서드 참조란 무엇일까?
선정 배경
스트림을 쓸 때 메서드 참조에 익숙하지 않아 람다식을 적고나면 인털리제이가 추천해주는데로 메서드 참조를 하였다. 메서드 참조가 뭐길래 더 좋을까?
관련 챕터
Ch.3