Java 8 Collectors.toMap SortedMap

我正在使用Java 8 lambdaexpression式,并希望使用Collectors toMap来返回一个SortedMap 。 我能想到的最好的办法是用一个mapSupplierTreeMap::new的dummy mergeFunctionmapSupplier调用下面的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> 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 lambda是相同的throwingMerger()但我不能直接调用,因为它是封装私人(你当然可以总是让你自己的静态方法,像throwingMerger()是。

基于dkatzel确认没有一个很好的API方法,我select维护我自己的自定义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()方法或使用明确的lambda。 在我的StreamEx库中,我定义了也使用我自己的throwingMerger()toSortedMap方法。

另一种方法是让Collectors.toMap()返回要返回的映射,然后将其传递给一个新的TreeMap <>()。

需要注意的是,只有当你的“hashCode()+ equals()”和“compareTo”是一致的。 如果它们不一致,那么你最终将使用HashMap去除与你的TreeMap不同的一组键。