gpt4 book ai didi

Java 8 Lambda(一步分组和归约)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:23 24 4
gpt4 key购买 nike

假设我有一个 Pair 对象列表,

List<Pair<A,B>> listOfPairs = //some list of pairs ; 

我想将此列表分组为 Map<A,Set<B>> .

目前,我可以分两步完成。第一步按A分组,返回a Map<A,Set<Pair<A,B>>如下:

   Map<A,Set<Pair<A,B>> intermediateStep =   listOfPairs.stream().collect(Collectors.groupingBy((Pair::getLeft), Collectors.toSet()));

然后我流式传输上面映射的入口集并将它们收集到所需的最终结果中,主要是通过将每个 Pair 对象映射到它的 B 值,并将它们收集到一个集合中:

 Map<A, Set<B>> finalResult= intermediateStep.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().stream().map(Pair::getRight).collect(Collectors.toSet())));

是否有更好的方法可以一步到位?也就是说,上面说的中间步骤是按A分组,但是分组的右边返回的是整个Pair对象。我想按 A 分组并一步将 A 指向其关联 B 的集合。

(我知道仅仅因为我可以一步完成,并不意味着我应该这样做,因为可读性可能会受到影响,但我很好奇。)

谢谢!

最佳答案

您可以通过将 mapping 收集器传递到 groupingBy 收集器来简化代码,如下所示:

Map<A, Set<B>> collect = 
listOfPairs.stream()
.collect(Collectors.groupingBy(Pair::getLeft,
Collectors.mapping(Pair::getRight,
Collectors.toSet())));

关于Java 8 Lambda(一步分组和归约),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com