들어가며
람다의 가장 큰 장점은 간결함이다. 근데 그 람다보다 더 간결하게 만드는 방법이 있는데 그 방법이 메소드 참조다. 다음 코드를 보자.
1 | //lambda |
메소드 참조를 사용한 것이 람다를 사용한것 보다 더 간결하다. 하지만 어떤 람다에서는 매개변수의 이름 자체가 프로그래머에게 좋은 가이드가 되기도 한다. 이런 람다는 길이는 더 길지만 메소드 참조보다 읽기 쉽고 유지보수하기도 좋다.
람다로 할 수 없는 일이라면 메소드 참조로도 할 수 없다. 애매한 예외가 있긴 한데 다음과 같은 코드이다. <F extends Exception> () -> String throws F
다시 본론으로 돌아와 메소드 참조를 사용하는 편이 보통은 더 짧고 간결해 진다. 즉, 람다로 작성할 코드를 새로운 메소드에 담은 다음 람다 대신 그 메소드를 사용하는 것이다. 하지만 때론 람다가 메소드 참조보다 더 간결할 때도 있다. 다음 코드를 보자.
1 | service.execute(GoshThisClassNameIsHumongous::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 TreeMap |
배열 생성자 | int[]::new | len -> new int[len] |