Programing

Java 8 Collectors.toMap SortedMap

lottogame 2020. 11. 25. 07:29
반응형

Java 8 Collectors.toMap SortedMap


Java 8 람다를 사용 Collectors toMap하고 있으며 SortedMap. 내가 생각 해낼 수있는 최선의 Collectors toMap방법은 더미 mergeFunctionmapSupplier같은 다음 메서드 를 호출하는 TreeMap::new입니다.

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> mapSupplier) {
    BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element),
            valueMapper.apply(element), mergeFunction);
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}

다음과 같이 throwingMerger()기본 toMap구현과 동일한 방식으로 원하는대로 병합 함수를 전달하고 싶지 않습니다 .

public static <T, K, U>
        Collector<T, ?, Map<K, U>> toMap(Function<? super T, ? extends K> keyMapper,
                Function<? super T, ? extends U> valueMapper) {
    return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

Collectors반환하는 데 사용하는 가장 좋은 방법은 무엇입니까 SortedMap?


나는 당신이 이것보다 훨씬 나아질 수 있다고 생각하지 않습니다.

.collect(Collectors.toMap(keyMapper, valueMapper,
                        (v1,v2) ->{ throw new RuntimeException(String.format("Duplicate key for values %s and %s", v1, v2));},
                        TreeMap::new));

여기서 throw람다는 동일 throwingMerger()하지만 패키지 비공개이기 때문에 직접 호출 할 수 없습니다 (물론 항상 고유 한 정적 메서드를 만들 수 있습니다 throwingMerger().)


좋은 API 메서드가 없다는 dkatzel의 확인에 따라, 저는 제 고유 한 Collectors 클래스를 유지하기로 선택했습니다.

public final class StackOverflowExampleCollectors {

    private StackOverflowExampleCollectors() {
        throw new UnsupportedOperationException();
    }

    private static <T> BinaryOperator<T> throwingMerger() {
        return (u, v) -> {
            throw new IllegalStateException(String.format("Duplicate key %s", u));
        };
    }

    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, Supplier<M> mapSupplier) {
        return Collectors.toMap(keyMapper, valueMapper, throwingMerger(), mapSupplier);
    }

}

자체 throwingMerger()메서드 를 정의 하거나 명시 적 람다를 사용 하지 않고이를 수행하는 표준 방법이없는 것 같습니다 . 내 StreamEx 라이브러리에서 나는 정의 toSortedMap도 방법을 사용하여 내 자신을 throwingMerger().


이를 수행 할 수있는 또 다른 방법은 Collectors.toMap ()이 반환 할 맵을 반환하도록 허용 한 다음이를 새 TreeMap <> ()에 전달하는 것입니다.

주의 할 점은 "hashCode () + equals ()"및 "compareTo"가 일관된 경우에만 작동한다는 것입니다. 일관성이 없으면 HashMap이 TreeMap과 다른 키 세트를 제거하게됩니다.


구아바 라이브러리를 사용하는 경우 다음을 사용할 수 있습니다.

.collect(ImmutableSortedMap.toImmutableSortedMap(comparator, keyMapper, valueMapper));

The resulting map will be a SortedMap and also immutable.

참고URL : https://stackoverflow.com/questions/31004899/java-8-collectors-tomap-sortedmap

반응형