peaches-book-study / effective-java

이펙티브 자바 3/E
0 stars 2 forks source link

Item 43. 람다보다는 메서드 참조를 사용하라 #43

Open hyunsoo10 opened 3 months ago

hyunsoo10 commented 3 months ago

Chapter : 7. 람다와 스트림

Item : 43. 람다보다는 메서드 참조를 사용하라

Assignee : hyunsoo10


🍑 서론

람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다. 하지만 이보다 더 간결하게 만들 수 있는 방법이 바로 메서드 참조다.

🍑 본론

🔸람다

map.merge(key, 1, (count, incr) -> count + incr);

깔끔해 보이지만, 매개변수 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());

메서드 참조 쪽이 더 짧지도, 명확하지도 않기 때문에 람다 쪽이 더 낫다.

인스턴스 메서드를 참조하는 유형은 다섯 가지다. 본론에서 살펴 본 것이 정적 메서드 참조다.

나머지 유형 네가지를 살펴보자.

✏️한정적 인스턴스 메서드 참조

✏️비한정적 인스턴스 메서드 참조

✏️클래스 생성자 메서드 참조

//클래스 생성자 메서드 참조
TreeMap<K, V>::new
//같은 기능의 람다
() -> new TreeMap<K,V>()

✏️배열 생성자 메서드 참조

//배열 생성자 메서드 참조
int[]::new
//같은 기능의 람다
len -> new int[len]

🍑 결론

메서드 참조는 람다의 간단명료한 대안이 될 수 있다. 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때만 람다를 사용하라.


Referenced by

-

Lainlnya commented 3 months ago

이번에도 제목이 이상한 현수오빠,,

youngkimi commented 3 months ago

제목 양식 준수해주세요

hyunsoo10 commented 3 months ago

이번에도 제목이 이상한 현수오빠,,

시정했습니다

hyunsoo10 commented 3 months ago

제목 양식 준수해주세요

네네 그래야지요~ 알겠습니다요~

hyunsoo10 commented 3 months ago
IntFunction<int[]> arrayCreator = int[]::new;
int[] newArray = arrayCreator.apply(5);
Lainlnya commented 3 months ago
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<int[]> arraySupplier = int[]::new;
        int[] array = arraySupplier.get();

        // 배열 초기화
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1;
        }

        // 배열 출력
        for (int num : array) {
            System.out.println(num);
        }
    }
}