繁体   English   中英

如何在Java 8中将Map转换为List

[英]How to convert Map to List in Java 8

如何在Java 8中将Map<String, Double>转换为List<Pair<String, Double>>

我写了这个实现,但是效率不高

Map<String, Double> implicitDataSum = new ConcurrentHashMap<>();
//....
List<Pair<String, Double>> mostRelevantTitles = new ArrayList<>();
implicitDataSum.entrySet().stream().
                .sorted(Comparator.comparing(e -> -e.getValue()))
                .forEachOrdered(e -> mostRelevantTitles.add(new Pair<>(e.getKey(), e.getValue())));

return mostRelevantTitles;

我知道它应该使用.collect(Collectors.someMethod()) 但是我不知道该怎么做。

好吧,您想将Pair元素收集到List 这意味着您需要将Stream<Map.Entry<String, Double>>映射到Stream<Pair<String, Double>>

这是通过map操作完成的:

返回一个流,该流包括将给定函数应用于此流的元素的结果。

在这种情况下,该函数将是一个将Map.Entry<String, Double>转换为Pair<String, Double>的函数。

最后,您希望将其收集到List ,因此我们可以使用内置的toList()收集器。

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .sorted(Comparator.comparing(e -> -e.getValue()))
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());

请注意,可以将比较器Comparator.comparing(e -> -e.getValue())替换为Map.Entry.comparingByValue(Comparator.reverseOrder())

请注意,如果您想高效地实施,则应考虑以下事项:

List<Pair<String, Double>> mostRelevantTitles = 
    implicitDataSum.entrySet()
                   .stream()
                   .map(e -> new Pair<>(e.getKey(), e.getValue()))
                   .collect(Collectors.toList());
mostRelevantTitles.sort(Comparators.comparing(Pair::getSecond, Comparator.reverseOrder()));

我假设您的Pair类具有getSecond getter。

使用sorted()流管道步骤,您可以创建中间缓冲区,将所有内容存储到该缓冲区,将其转换为数组,对该数组进行排序,然后将结果存储到ArrayList 我的方法虽然功能较少,但将数据直接存储到目标ArrayList ,然后就地对其进行排序,而无需任何其他复制。 因此,我的解决方案将花费较少的时间和中间内存。

    public List<TeamResult> process(final Map<String, Team> aggregatedMap) {
   return aggregatedMap.entrySet()
                       .stream()
                       .map(e -> new TeamResult(e.getKey(),e.getValue()))
                       .collect(Collectors.toList());
    }

根据相反的值对地图进行排序,并收集列表中的键,并且仅限制列表中的前2个结果

    List<String> list = map.keySet().stream()
                .sorted((k1, k2)->map.get(k2)- map.get(k1))
                .limit(2)
                .collect(Collectors.toList())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM