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

2022-09-02 12:08:48

如何在Java 8中将a转换为?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())


答案 1

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

这是通过映射操作完成的:

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

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

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

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


答案 2

请注意,如果您想要高效的实现,则应考虑以下几点:

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()));

我假设你的班级有getter。PairgetSecond

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


推荐