作者:小帅哥小羊儿_309 | 来源:互联网 | 2022-11-30 16:10
我想点一个HashMap
:
Map> unsorted
按值集的大小.我尝试按如下方式进行:
Map> sorted = unsorted.entrySet().stream()
.sorted(comparingInt(e->e.getValue().size()))
.collect(toMap(
Map.Entry::getKey,
Map.Entry::getValue,
LinkedHashMap::new
));
但是得到了一个错误
"无法从静态上下文引用非静态方法"
.我是Java 8 Streams的新手,显然缺少一些微不足道的东西 - 它是什么?
1> Ousmane D...:
简短的回答:你错过了合并功能:
.collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (l, r) -> l, LinkedHashMap::new));
即(l, r) -> l
上面.
答案很长:
您想要使用toMap
带有"mapFactory" 的重载,因为doc调用它,实际上它是一个供应商,提供一个新的空映射,结果将插入其中.
现在看看如何定义重载:
toMap?(Function super T,? extends K> keyMapper,
Function super T,? extends U> valueMapper,
BinaryOperator mergeFunction,
Supplier mapFactory)
你可以看到mergeFunction
为了提供"mapFactory"是必需的,否则编译器会认为你正在尝试使用这个重载:
toMap?(Function super T,? extends K> keyMapper,
Function super T,? extends U> valueMapper,
BinaryOperator mergeFunction)
因此它失败了上述错误.