[Effective Java] 람다보다는 메소드 참조를 사용하라

들어가며

람다의 가장 큰 장점은 간결함이다. 근데 그 람다보다 더 간결하게 만드는 방법이 있는데 그 방법이 메소드 참조다. 다음 코드를 보자.

1
2
3
4
5
//lambda
map.merge(key, 1, (count, incr) -> count + incr);

//method reference
map.merge(key, 1, Integer::sum);

메소드 참조를 사용한 것이 람다를 사용한것 보다 더 간결하다. 하지만 어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다. 이런 람다는 길이는 더 길지만 메소드 참조보다 읽기 쉽고 유지보수하기도 좋다.

람다로 할 수 없는 일이라면 메소드 참조로도 할 수 없다. 애매한 예외가 있긴 한데 다음과 같은 코드이다. <F extends Exception> () -> String throws F 다시 본론으로 돌아와 메소드 참조를 사용하는 편이 보통은 더 짧고 간결해 진다. 즉, 람다로 작성할 코드를 새로운 메소드에 담은 다음 람다 대신 그 메소드를 사용하는 것이다. 하지만 때론 람다가 메소드 참조보다 더 간결할 때도 있다. 다음 코드를 보자.

1
2
3
service.execute(GoshThisClassNameIsHumongous::action);

service.execute(() -> action());

메소드 참조 쪽은 더 짧지도 더 명확하지도 않다. 따라서 람다쪽이 더 낫다. 메소드 참조의 유형은 다섯가지로 다음 표를 참고하자.

메소드 참조 유형 메소드 참조 람다
정적 Integer::parseInt str -> Integer.parseInt(str)
한정적(인스턴스) Instant.now()::isAfter Instant then = Instant.now(); t -> then.isAfter(t)
비한정적(인스턴스) String::toLowerCase str -> str.toLowerCase()
클래스 생성자 TreeMap::new () -> new TreeMap()
배열 생성자 int[]::new len -> new int[len]
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/16/Languages/Effective%20JAVA/item43/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.