이펙티브 자바
아이템 43. 람다보다 매서드 참조를 사용하라.
람다가 익명 클래스보다 가장 큰 나은점은 간결함이다.
자바에서 람다 보다 더 간결하게 만들수 있는것이 있는데 그것은 메서드 참조이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.github.sejoung.codetest.lamdas;
import java.util.List; import java.util.Map; import java.util.TreeMap;
public class Freq { public static void main(String[] args) { Map<String, Integer> frequencyTable = new TreeMap<>();
List<String> list = List.of("A","B","C","A");
for (String s : list) frequencyTable.merge(s, 1, (count, incr) -> count + incr);
System.out.println(frequencyTable);
} }
|
실행결과
1 2 3 4 5
| {A=2, B=1, C=1}
Process finished with exit code -1
|
위에선 람다를 사용한 경우 코드 이다.
다시 메서드 참조를 사용하면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.github.sejoung.codetest.lamdas;
import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
public class Freq { public static void main(String[] args) { Map<String, Integer> frequencyTable = new TreeMap<>();
List<String> list = List.of("A","B","C","A");
for (String s : list) frequencyTable.merge(s, 1, Integer::sum); System.out.println(frequencyTable);
} }
|
실행결과
1 2 3 4 5
| {A=2, B=1, C=1}
Process finished with exit code -1
|
코드가 간결해진다. 그럼 반대의 경우는 한번 살펴 보겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.github.sejoung.codetest.lamdas;
public class GoThisClassNameIsHumongous{
public static void action(){ System.out.println("GoThisClassNameIsHumongous action");
}
}
|
위에 클래스가 있고 실행을
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.github.sejoung.codetest.lamdas;
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
public class Freq { public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(10);
es.execute(GoThisClassNameIsHumongous::action);
es.shutdown(); } }
|
실행결과
1 2 3 4
| GoThisClassNameIsHumongous action
Process finished with exit code 0
|
위에 코드인데 람다로 표현하면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.github.sejoung.codetest.lamdas;
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
public class Freq { public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(10);
es.execute(() -> System.out.println("lamdas action"));
es.shutdown(); } }
|
실행결과
1 2 3 4
| lamdas action
Process finished with exit code 0
|
위에 람다 표현이 더 심플하다.
메서드 참조는 람다의 간단한 대안이 될수도 있다. 하지만 람다가 더 짧고 명료하면 람다를 사용하자.
Example 9.9-2. Generic Function Types 만이 유일하게 람다를 사용하지 못하는 경우 이다.
참조