메서드 레퍼런스는 특정 메서드만을 호출하는 람다의 축약 표현이라고 생각할 수 있다.
람다가 특정 메서드를 직접 호출하게 된다면 메서드를 어떻게 호출해야 하는지 설명을 참조 하기 보다 메서드 명을 직접 참조 하도록 하는 것이다.
메서드 레퍼런스를 이용한다면 기존 메서드 구현으로 람다 표현식을 만들 수 있다.
이때 명시적으로 메서드명을 참조 하게 됨으로서 가독성을 높일 수 있는 장점이 있다.
메서드 레퍼런스는 메서드명 앞에 구분자 (::)를 붙이는 방식으로 사용된다.
Car :: getPrice (== (Car c) -> getPrice())는 Car 클래스의 getPrice의 메서드 레퍼런스를 뜻한다.
[예제]
(Car c) -> c.getPrice() =========> Car :: getPrice
() -> Thread.currentThread().dumpStack() =========> Thread.currentThread()::dumpStack
(str, i) -> str.substring(i) =========> String::substring
(String s) -> System.out.println(s) =========> System.out::println
메서드 레퍼런스는 하나의 메서드를 참조하는 람다를 편리하게 표현할 수 있는 문법이다.
메서드 레퍼런스를 이용하면 같은 기능을 더 간결하게 구현할 수 있다.
<메서드 레퍼런스 만드는 방법>
1. 정적 메서드 레퍼런스
- Integer의 parseInt 메서드는 Integer::parseInt
2. 다양한 형식의 인스턴스 메서드 레퍼런스
- String의 length 메서드는 String::length
3. 기존 객체의 인스턴스 메서드 레퍼런스
- Car 객체를 할당받은 bmw 지역 변수가 있고, Car 객체에는 getPrice라는 메서드가 있다면 bmw::getPrice라고 표현할 수 있다.
생성자, 배열 생성자, super 호출 등에 사용할 수 있는 특별한 형식의 메서드 레퍼런스도 있다.
<생성자 레퍼런스>
ClassName::new 처럼 클래스명과 new 키워드를 이용해서 기존 생성자의 레퍼런스를 만들 수 있다.
1> 인수가 없는 생성자
Supplier의 ()->Car
Supplier<Car> c1 = Car::new;
Car c2 = c1.get();
2> 인수가 하나인 생성자
Function 인터페이스의 시그너처와 같다.
Function<Integer, Car> f1 = Car :: new
Car c1 = f1.apply(100);
[예]
List<Integer> prices = Arrays.asList(100,200,300);
List<Car> cars = map(prices, Car::new);
public static List<Car> map (List<Integer> prices, Function<Integer, Car> f){
List<Car> cars = new Array<>();
for(Integer price : prirces){
cars.add(f.apply(price)));
}
return cars;
}
3> 인수가 두개인 생성자
BiFunction인터페이스와 같은 시그너처를 가진다.
BiFunction<String, Integer, Car> c3 = Car::new;
Car c4 = c3.apply("bmw", 1000);
[출처 : JAVA8 in Action]
'JAVA' 카테고리의 다른 글
[JAVA] OkHttp로 REST API 호출하기 (0) | 2019.01.18 |
---|---|
[JAVA] HttpClient로 REST API 호출하기 (0) | 2019.01.18 |
[JAVA] HttpURLConnection로 REST API 호출하기 (0) | 2019.01.18 |
[JAVA] REST API Client Library 알아보기 in Java Project (0) | 2019.01.17 |
[JAVA 8] 형식 검사, 형식 추론, 제약 (0) | 2018.09.18 |