[英]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.