问题描述
我正在使用Java 8 lambdas并希望使用收集器
toMap
返回的SortedMap
。我能想到的最好的方法是使用虚拟调用以下
和收集器
toMap
方法mergeFunction mapSupplier
等于 TreeMap :: new
。
I'm using Java 8 lambdas and want to use Collectors
toMap
to return a SortedMap
. The best I can come up with is to call the following Collectors
toMap
method with a dummy mergeFunction
and mapSupplier
equal to 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
实现方式相同,如下所示:
I don't want to pass in a merge function though, as I just want throwingMerger()
, in the same way as the basic toMap
implementation as follows:
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);
}
使用收藏家的最佳做法是什么?
返回 SortedMap
?
推荐答案
我认为你不能比这更好:
I don't think you can get much better than this:
.collect(Collectors.toMap(keyMapper, valueMapper,
(v1,v2) ->{ throw new RuntimeException(String.format("Duplicate key for values %s and %s", v1, v2));},
TreeMap::new));
其中抛出
lambda与 throwingMerger()
但是我无法直接调用它,因为它是私有的包(当然你总是可以创建自己的静态方法,如 throwingMerger( )
是。)
where the throw
lambda is the same as throwingMerger()
but I can't directly call that since it's package private (you can of course always make your own static method for that like throwingMerger()
is. )
这篇关于Java 8 Collectors.toMap SortedMap的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!