람다가 하는 일이 기존 메서드 또는 생성자를 호출하는 거라면, 메서드 레퍼런스를 사용해서 매우 간결하게 표현할 수 있다.
메서드 참조하는 방법
스태틱 메서드 참조 | 타입::스태틱 메서드 |
특정 객체의 인스턴스 메서드 참조 | 객체 레퍼런스::인스턴스 메서드 |
임의 객체의 인스턴스 메서드 참조 | 타입::인스턴스 메서드 |
생성자 참조 | 타입::new |
•
메서드 또는 생성자의 매개변수로 람다의 입력값을 받는다.
•
리턴값 또는 생성한 객체는 람다의 리턴값이다.
public class Greeting {
private String name;
public Greeting() {
}
public Greeting(String name) {
this.name = name;
}
public String hello(String name) {
return "hello " + name;
}
public static String hi(String name) {
return "hi " + name;
}
}
Java
복사
이러한 클래스가 있다고 가정한다.
//String 타입으로 입력받고 동일한 String 타입으로 리턴해주어서 UnaryOperator 사용
UnaryOperator<String> hi = Greeting::hi; //Greeting 클래스의 static hi 메서드 참조
System.out.println(hi.apply("jjw")); //출력: hi jjw
Java
복사
스태틱 메서드 참조
Greeting greeting = new Greeting();
UnaryOperator<String> hello = greeting::hello; //Greeting 클래스의 hello 메서드 참조
System.out.println(hello.apply("jjw")); //출력: hello jjw
Java
복사
특정 객체의 인스턴스 메서드 참조
String[] names = {"ajjw", "bjjw", "cjjw"};
Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
//Comparator는 함수형 인터페이스
//메서드 레퍼런스로 표현
Arrays.sort(names, String::compareToIgnoreCase);
Java
복사
임의 객체의 인스턴스 메서드 참조
//1. 입력값 없이 리턴해주는 Supplier 사용
Supplier<Greeting> newGreeting = Greeting::new;
Greeting greeting = newGreeting.get();
//2. 입력값을 받고 리턴해주는 Function 사용
Function<String, Greeting> jjwGreeting = Greeting::new;
Greeting jjw = jjwGreeting.apply("jjw");
System.out.println(jjw.getName()); //출력: jjw
Java
복사
생성자 참조