GroupBy并合并到java中的单个列表中

问题描述 投票:2回答:3

Java 8在收集器中提供了groupingBy函数,但它提供了元素映射。我需要将地图转换为单个列表。

它也返回结果,但我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在lambda表达式中不能重新分配。

我怎样才能做到这一点?

我想实现这个目标:

Map<String, List<Node>> nodeListGrouped = nodeList.stream().collect(Collectors.groupingBy(node -> node.getGroupName()));

将nodeListGrouped转换为单个List

但nodeListGrouped.values()返回Collection(List)

lambda java-8 collectors
3个回答
2
投票

我认为这就是你要找的东西(虽然我还没编译过)

List<Node> list = 
         nodeList.stream()
                 .collect(Collectors.collectingAndThen(
                     Collectors.groupingBy(Node::getGroupName),
                     map -> map.values()
                               .stream()
                               .flatMap(List::stream)
                               .collect(Collectors.toList())
));

3
投票

Collection<List<Node>>中的地图值展平为List<Node>几乎肯定不是你想要的,因为它实际上会产生与初始列表相同的结果;如果你确实想得到一个List<Node>作为结果然后不做任何事情,因为这是初始列表已经提供的。

你肯定需要重新思考你想要完​​成什么。问问你自己为什么我需要分组才能得到与初始列表相同的结果?一旦你找到答案,也许你会发现你根本不需要这样做,或者可能有其他方法可以更好地完成你的任务。


0
投票

我没有看到将地图转换回列表的好处,因为您将丢失分组键。你可以做的是通过调用List<Map.Entry<String, List<Node>>>方法而不是entrySet()将地图转换回values()

© www.soinside.com 2019 - 2024. All rights reserved.