메소드 참조(Method Reference)란 실행하려는 메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어 람다식에서 굳이 선언이 불필요한 부분을 생략하는 것을 말합니다.
(String a) → System.out.println(a)
System.out::println
위 처럼 문법 함축이 가능한 이유는 컴파일러가 람다식의 타입을 추론하기 때문입니다. 인터페이스의 추상 메서드 형태와 반환 메서드의 시그니처 형태가 같으면 됩니다.
람다식의 메소드 참조 문법을 사용하기 위해서는 다음의 3가지 조건을 만족하면 된다.
정적 메서드 참조
정적 메서드를 호출할 경우 :: 기호 앞에 클래스명을 그대로 기재하는 것이 특징
Function<String, Integer> stringToInt;
// 람다
stringToInt = (str) -> Integer.parseInt(str);
// 메서드 참조
stringToInt = Integer::parseInt;
인스턴스 메서드 참조
List<Number> lsit = new ArrayList<>();
Consumer<Collection<Number>> addElements;
// 람다
addElements = (arr) -> list.addAll(arr);
// 메서드 참조
addElements = list::addAll;
Consumer Interface
제네릭 타입의 매개변수를 받아 특정 작업을 수행해야 하는 경우 사용
매개변수를 사용하고 아무것도 생성(반환)하지 않음
매개변수의 메서드 참조
매개변수의 메서드를 참조할때, 매개변수의 클래스 타입명을 기재하는 것이 특징
Function<String, Integer> size;
// 람다
size = (String s1) -> s1.length();
// 메서드 참조
size = String::length;
생성자 참조
생성자도 일종의 메서드이기 때문에 메서드 참조가 가능합니다. 리턴 값이 단순히 새로운 객체를 생성하는 것이기 때문이죠
BiFunction<Integer, Integer, Object> contructor;
// 람다
constructor = (x, y) -> new Object(x, y);
// 메서드 참조
constructor = Object::new
BiFunction<T, U, R>
두개의 입력(T,U)을 받아서 하나의 결과(R)을 반환하는 함수