2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[item 37] 두 열거 타입을 매핑할 때, 안쪽 EnumMap의 생성 함수 #116

Open NuhGnod opened 1 year ago

NuhGnod commented 1 year ago

p.230 코드 37-6의 정적 필드 m의 초기화 과정 중 toMap 함수 중 (x,y) -> y 부분에 대한 설명으로 두 번째 수집기의 병합 함수인 (x,y) -> y 는 선언만 하고 실제로는 쓰이지 않는데, 이는 단지 EnumMap을 얻으려면 맵 팩터리가 필요하고 수집기들은 점층적 팩터리를 제공하기 때문이라고 되어있다.

실제 Collectors.toMap 함수를 보면

public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                             Function<? super T, ? extends U> valueMapper,
                             BinaryOperator<U> mergeFunction,
                             Supplier<M> mapFactory) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapFactory, accumulator, mapMerger(mergeFunction), CH_ID);
    }

로, (x,y) -> y는 mergeFunction 인자에 해당한다. 그런데 내가 이해한 것은 이 (x,y) -> y가 mapFactory 인자에 해당된다고 설명하고 있다고 이해했다. 그 이유는 맵 팩터리가 필요하고 부분이다.

또한, 실제로 (x,y) -> y 는 map을 초기화 하는데에 사용되고 있다. 예를 들어, (x,y) -> x로 수정하면, key가 중복된 경우에 먼저 선언된 Transition을 넣게 되고, -> y라면 나중에 선언된 Transition으로 덮어씌운다는 의미이다. 참고


질문

(x,y) -> y 에 대한 본문을 어떻게 이해하면 좋을까요?? 다른분들은 어떻게 이해하셨나요?