-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Labels
🐜 07 Lamdbas & Streams7장 람다와 스트림7장 람다와 스트림
Description
Chapter : 7. 람다와 스트림
Item : 43. 람다보다는 메서드 참조를 사용하라
Assignee : hyunsoo10
🍑 서론
람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다. 하지만 이보다 더 간결하게 만들 수 있는 방법이 바로 메서드 참조다.
🍑 본론
🔸람다
map.merge(key, 1, (count, incr) -> count + incr);- 자바 8 때 추가된 Map의 merge 메서드이다. merge 메서드는 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 아직 없다면 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 맵에 {키, 함수의 결과} 쌍을 저장한다.
깔끔해 보이지만, 매개변수 count, incr는 크게 하는 일 없이 공간을 차지한다. 자바 8이 되면서 Integer 클래스는 정적 메서드 sum을 제공한다.
🔹메서드 참조
//Integer 클래스의 sum 메서드
public static int sum(int a, int b) {
return a + b;
}
//정적 메서드 참조
map.merge(key, 1, Integer::sum);람다로 할 수 없는 일이라면 메서드 참조로도 할 수 없다.
메서드 참조를 사용하는 편이 보통은 더 짧고 간결하므로, 람다로 구현했을 때 너무 길거나 복잡하면 메서드 참조가 좋은 대안이되어준다.
IDE들은 람다를 메서드 참조로 대체하라고 권할 것이고, 보통 그 권고를 따르는 게 이득이지만, 항상 그런 것은 아니다.
때론 람다가 메서드 참조보다 간결할 때가 있다. 주로 메서드와 람다가 같은 클래스 안에 있을 때 그렇다.
예를들어 다음 코드가 GoshThisClassNameIsHumonous 클래스 안에 있다고 해보자.
🔹메서드 참조
service.execute(GoshThisClassNameIsHumonous::action);이를 람다로 대체하면 다음처럼 된다.
🔸람다
service.execute(()-> action());메서드 참조 쪽이 더 짧지도, 명확하지도 않기 때문에 람다 쪽이 더 낫다.
인스턴스 메서드를 참조하는 유형은 다섯 가지다. 본론에서 살펴 본 것이 정적 메서드 참조다.
나머지 유형 네가지를 살펴보자.
✏️한정적 인스턴스 메서드 참조
- 수신 객체(참조 대상 인스턴스)를 특정함
- 근본적으로 정적 메서드 참조와 비슷
- 즉, 함수 객체가 받는 인수와 참조되는 메서드가 받는 인수가 똑같다
//한정적 메서드 참조
Instant.now()::isAfter
//같은 기능의 람다
Instance then = Instant.now();
t->then.isAfter(t);✏️비한정적 인스턴스 메서드 참조
- 수신 객체(참조 대상 인스턴스)를 특정하지 않음
- 주로 스트림 파이프라인에서 매핑과 필터 함수에 쓰임(아이템 45)
//비한정적 메서드 참조
String::toLowerCase
//같은 기능의 람다
str -> str.toLowerCase();✏️클래스 생성자 메서드 참조
//클래스 생성자 메서드 참조
TreeMap<K, V>::new
//같은 기능의 람다
() -> new TreeMap<K,V>()✏️배열 생성자 메서드 참조
//배열 생성자 메서드 참조
int[]::new
//같은 기능의 람다
len -> new int[len]🍑 결론
메서드 참조는 람다의 간단명료한 대안이 될 수 있다. 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.
Referenced by
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
🐜 07 Lamdbas & Streams7장 람다와 스트림7장 람다와 스트림