我想订购HashMap
:
Map<Integer, Set<Integer>> unsorted
由值的大小设置。我尝试这样做,如下所示:
Map<Integer, Set<Integer>> sorted = unsorted.entrySet().stream()
.sorted(comparingInt(e->e.getValue().size()))
.collect(toMap(
Map.Entry::getKey,
Map.Entry::getValue,
LinkedHashMap::new
));
但出现错误
“不能从静态上下文中引用非静态方法”
。我是Java 8 Streams的新手,显然缺少一些琐碎的东西-这是什么?
答案 0 :(得分:7)
简短的答案:您缺少合并功能:
.collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (l, r) -> l, LinkedHashMap::new));
即上面(l, r) -> l
。
长答案:
您要使用toMap
重载,该重载需要doc调用它的“ mapFactory”,本质上,它是一个提供新的空映射并将其插入结果的供应商。
现在看看如何定义重载:
toMap(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapFactory)
如您所见,必须提供mergeFunction
才能提供“ mapFactory”,否则编译器会认为您正在尝试使用此重载:
toMap(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper,
BinaryOperator<U> mergeFunction)
因此,它由于上述错误而失败。