GroupBy并合并为Java中的单个列表

时间:2018-07-24 11:41:07

标签: lambda java-8 collectors

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

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

我该如何实现?

我想实现这一目标:

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

将nodeListGroup转换为单个List

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

3 个答案:

答案 0 :(得分:3)

将映射值从Collection<List<Node>>压平为List<Node>几乎是 ,这肯定不是您想要的,因为这实际上会产生与初始列表相同的结果;如果您确实想获得List<Node>作为结果,那么什么也不做,因为这就是初始列表所提供的。

您绝对需要重新考虑您想要完成的工作。问问自己,为什么我需要分组以仅得到与初始列表相同的结果?找到答案后,您可能会意识到自己根本不需要这样做,或者还有其他方法可以更好地完成任务。

答案 1 :(得分:2)

我认为这是您要寻找的(尽管我没有对此进行编译)

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

答案 2 :(得分:0)

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