1. ホーム
  2. java

Java 8 Collectors.toMap SortedMap

2023-08-15 01:13:15

質問

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() と同じですが、パッケージの private なので直接呼び出すことはできません。 throwingMerger() のように独自のスタティックメソッドを作ることもできます。)