메서드 참조는 특정 람다의 축약형이라고 생각할 수 있다.
메서드 참조를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있으며 때로는 람다 표현식보다 메서드 참조를 사용하는 것이 더 가독성이 좋으며 자연스러울 수 있다.
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));// 람다 표현식
inventory.sort(compareTo(Apple::getWeight));// 메서드 참조
위 코드를 보면 Apple::getWeight는 Apple에 정의된 getWeight의 메서드 참조다. 메서드명 앞에 구분자(::)를 분해 방식으로 메서드 참조를 활용하였다.
메서드 참조를 이용하면 같은 기능을 더 간결하게 구현할 수 있어서 가독성을 높일 수 있다.
메서드 참조를 새로운 기능이 아니라 하나의 메서드를 참조하는 람다를 편리하게 표현할 수 있는 문법으로 간주하면 되겠다.
메서드 참조는 세 가지 유형으로 구분할 수 있다.
// 람다 표현식
ToIntFunction<String> stringToInt = (String s) -> Integer.parseInt(s);
// 메서드 참조
Function<String, Integer> stringToInteger = Integer::parseInt;
// 람다 표현식
BigPredicate<List<String>, String> contains = (list, element) -> list.contains(element);
// 메서드 참조
BigPredicate<List<String>, String> contains = List::contains;
// 람다 표현식
Predicate<String> startsWithNumber = (String s) -> this.startsWithNumber(s);
// 메서드 참조
Predicate<String> startsWithNumber = this::startsWithNumber;
이 유형은 비공개 헬퍼 메서드를 정의한 상황에서 유용하게 활용할 수 있다.