Java 8 Collectors.toMap SortedMap
我正在使用Java 8 lambdaexpression式,并希望使用Collectors
toMap
来返回一个SortedMap
。 我能想到的最好的办法是用一个mapSupplier
于TreeMap::new
的dummy mergeFunction
和mapSupplier
调用下面的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不同的一组键。