【问题标题】:Ordering HashMap by the size of the value set按值集的大小对 HashMap 进行排序
【发布时间】:2019-04-08 22:39:25
【问题描述】:

我想订购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 的新手,显然遗漏了一些微不足道的东西 - 它是什么?

【问题讨论】:

    标签: java hashmap java-stream


    【解决方案1】:

    简短回答:您缺少合并功能:

    .collect(toMap(Map.Entry::getKey,Map.Entry::getValue, (l, r) -> l, LinkedHashMap::new));
    

    (l, r) -&gt; l 以上。

    长答案:

    您希望使用 toMap 重载,它采用文档中所称的“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)
    

    因此它因上述错误而失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-18
      • 2011-12-28
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2011-11-05
      相关资源
      最近更新 更多