Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagejava
themeRDark
firstline1
titlemap.merge를 이용해 구현한 빈도표
linenumberstrue
collapsetrue
public static void main(String[] args) {
    Map<String, Integer> frequencyTable = new TreeMap<>();
    
    for (String s : args)
        frequencyTable.merge(s, 1, (count, incr) -> count + incr); // 람다
    System.out.println(frequencyTable);

    frequencyTable.clear();
    for (String s : args)
        frequencyTable.merge(s, 1, Integer::sum); // 메서드 참조
    System.out.println(frequencyTable);

}
메서드 참조 유형같은기능을 하는 람다
정적Integer::parsIntstr → Integer.partInt(str)
한정적(인스턴스)Instant.now()::isAfter

Instant then = Instant.now();

t → then.isAfter(t)

비한정적(인스턴스)String::toLowerCasestr → str.toLowerCase()
클래스 생성자TreeMap<K,V>::new() → new TreeMap<K,V>()
배열 생성자int[]::newlen → new int[len]


  • 람다로는 불가능하나 메서드 참조로 가능한 유일한 예는 제네릭 함수 타입 구현
  • 아래의 예처럼 람다식으로 표현이 불가한 경우가 있음. (제네릭 람다식이란게 없음)

...

아이템 44. 표준 함수형 인터페이스를 사용하라.

  • API를 작성하는 사례의 변경
    • 템플릿 메서드 패턴 → 함수 객체를 받는 static factory나 생성자 제공
  • 함수형 인터페이스는 java.util.function 패키지에 있다. 
    • 웬만하면 잘 정의되어 제공되고 있는 함수형 인터페이스를 사용하자.
    • 총 43개 이지만 몇가지만 기억하면 나머지는 유추가 가능하다.
인터페이스함수 시그니처
UnaryOperator<T>T apply(T t)String::toLowerCase
BinaryOperator<T>T apply(T t)BigInteger::add
Predicate<T>boolean test(T t)Collection:isEmpty
Function<T,R>R apply(T t)Arrays::asList
Supplier<T>T get()Instant::now
Consumer<T>void accept(T t)System.out::println
  • 새로운 함수형 인터페이스를 작성하고자 할 때는 @FunctionalInterface 를 붙인다.
    • 해당 클래스의 코드나 설명 문서를 읽을 이에게 그 인터페이스가 람다용으로 설계된 것임을 알려준다.
    • 해당 인터페이스가 추상 메서드를 오직 하나만 가지고 있어야 컴파일이 되게 해준다.
    • 유지보수 과정에서 실수로 메서드를 추가하지 못하게 막아준다.
  • 함수형 인터페이스를 API에서 사용할 때 주의점
    • 서로 다른 함수형 인터페이스를 같은 위치의 인수로 받는 메서드들을 다중으로 정의하면 안된다. → 모호함
    • 함수형 인터페이스에 박싱된 기본 타입을 넣지 말자. → 아이템 61에 위배