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