Java 8在Collectors中提供了groupingBy函数,但是它提供了元素映射。我需要将地图转换为单个列表。
它也返回结果,但是我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在lambda表达式中不可能重新分配。
我该如何实现?
我想实现这一目标:
Map<String, List<Node>> nodeListGrouped = nodeList.stream().collect(Collectors.groupingBy(node -> node.getGroupName()));
将nodeListGroup转换为单个List
但是nodeListGrouped.values()返回Collection(List)
答案 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()
。