按值集的大小排序HashMap

时间:2018-11-05 14:43:44

标签: java hashmap java-stream

我想订购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的新手,显然缺少一些琐碎的东西-这是什么?

1 个答案:

答案 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)

因此,它由于上述错误而失败。