【问题标题】:java Stream collect to TreeMap in reverse orderjava Stream以相反的顺序收集到TreeMap
【发布时间】:2019-11-23 18:03:54
【问题描述】:

我有以下代码从流中收集地图,并将其转换为树图

Map<String, String> result = myMap.values().stream().collect(Collectors.toMap(Person::getScore, Person::getName));
    return new TreeMap<>(result);

有没有办法可以在同一行中返回降序排序的 treeMap?我不能将比较器作为参数传递。

【问题讨论】:

    标签: java maps java-stream treemap


    【解决方案1】:

    我认为您可以使用返回收集器的四个参数toMap 方法。假设getScore 方法返回一个Integer(或者如果你愿意,你可以使用String,但我认为它会不太有用):

    //supplier of TreeMap with your custom comparator
    Supplier<TreeMap<Integer, String>> myMapSupplier = () -> new TreeMap<>(Comparator.reverseOrder());
    
    Map<Integer, String> result = myMap.values()
                 .stream()
                 .collect(Collectors.toMap(Person::getScore, Person::getName, (s, s2) -> s, myMapSupplier));
    

    最后一个元素是Map 的供应商。正如documentation 所说:

    mapSupplier - 返回一个新的空Map 结果将插入其中的函数

    因此,您仍然可以在一次调用中使用 TreeMap 和自定义 Comparator

    【讨论】:

      【解决方案2】:

      您可以使用sortedComparator 并使用LinkedHashMap 收集如下,

      Map<String, String> result = myMap.values().stream()
                      .sorted(Comparator.comparing(Person::getScore, Comparator.reverseOrder()))
                      .collect(Collectors.toMap(Person::getScore, Person::getName, (x, y) -> x,LinkedHashMap::new));
      

      我建议使用int 作为分数,因为字符串会在词法上进行比较。所以你的结果图是Map&lt;Integer, String&gt;

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2020-07-02
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2021-06-24
        相关资源
        最近更新 更多