메서드 참조 사용하기
•
람다식을 통해 익명 클래스보다 간결하고 깔끔하게 코드를 작성할 수 있다. 여기에 참조 메서드를 더하면 람다식을 더욱 간결하게 표현할 수 있다.
•
아래와 같은 코드가 있을 때,
map.merge(key, 1, (count, incr) -> count + incr);
Java
복사
•
count, incr과 같은 람다식에서 인수는 크게 하는 일 없이 공간만 차지한다. 이 부분을 메서드 참조 방식을 사용하여 줄여 더 간결하게 표현하자
map.merge(key, 1, Integer::sum);
Java
복사
•
다만 어떤 람다식에서는 매개변수의 이름이 좋은 가이드가 되어, 람다의 길이가 더 길지만 메서드 참조보다 읽기 쉽고 유지보수가 용이할 수 있다.
•
또한, 주로 메서드와 람다가 같은 클래스에 있는 경우 람다식이 메서드 참조보다 간결할 수도 있다.
service.execute(GoshThisClassNamsIsHumongous::action);
Java
복사
service.execute(() -> action());
Java
복사
•
이런 경우에는 메서드 참조가 더 길기도 하고, 더 명확하지도 않기 때문에 람다식을 사용하는 것이 낫다.
메서드 참조 유형
메서드 참조 유형 | 예시 | 같은 기능을 하는 람다식 |
정적 | Integer::parseInt | str → Integer.parseInt(str) |
한정적(인스턴스) | Instant.now()::isAfter | Instant then = Instant.now();
t → then.isAfter(t) |
비한정적(인스턴스) | String::toLowerCase | str → str.toLowerCase() |
클래스 생성자 | TreeMap<K, V>::new | () → new TreeMap<K, V>() |
배열 생성자 | int[]::new | len → new int[len] |
•
정적 메서드 참조
Function<String, Integer> stringToInt;
// (x) -> ClassName.method(x)
stringToInt = (s) -> Integer.parseInt(s);
// ClassName::method
stringToInt = Integer::parseInt;
stringToInt.apply("100");
Java
복사
•
인스턴스 메서드 참조
ArrayList<Number> list = new ArrayList<>();
Consumer<Collection<Number>> addElements;
// (x) -> obj.method(x)
addElements = (arr) -> list.addAll(arr);
// obj::method
addElements = list::addAll;
addElements.accept(List.of(1, 2, 3, 4, 5));
System.out.println(list); // [1, 2, 3, 4, 5]
Java
복사
•
매개변수의 메서드 참조
Function<String, Integer> size;
// (obj, x) -> obj.method(x)
size = (String s1) -> s1.length();
// ClassName::method
size = String::length;
size.apply("Hello World"); // 11
Java
복사
•
생성자 참조
BiFunction<Integer, Integer, Object> constructor;
// (x, y) -> new ClassName(x, y)
constructor = (x, y) -> new Object(x, y);
// ClassName::new
constructor = Object::new;
Java
복사