Search
Duplicate

아이템 43 - 람다보다는 메서드 참조를 사용하라

작성자
챕터
7장 - 람다와 스트림
최종 편집
2023/07/31 18:53
생성 시각
2023/07/28 23:32

메서드 참조 사용하기

람다식을 통해 익명 클래스보다 간결하고 깔끔하게 코드를 작성할 수 있다. 여기에 참조 메서드를 더하면 람다식을 더욱 간결하게 표현할 수 있다.
아래와 같은 코드가 있을 때,
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
복사