按值集的大小排序HashMap

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的新手,显然缺少一些微不足道的东西 - 它是什么?

Ous*_* D. 7

简短的回答:你错过了合并功能:

.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)

因此它失败了上述错误.