Java 8在收集器中提供了groupingBy函数,但它提供了元素映射。我需要将地图转换为单个列表。
它也返回结果,但我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在lambda表达式中不能重新分配。
我怎样才能做到这一点?
我想实现这个目标:
Map<String, List<Node>> nodeListGrouped = nodeList.stream().collect(Collectors.groupingBy(node -> node.getGroupName()));
将nodeListGrouped转换为单个List
但nodeListGrouped.values()返回Collection(List)
我认为这就是你要找的东西(虽然我还没编译过)
List<Node> list =
nodeList.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(Node::getGroupName),
map -> map.values()
.stream()
.flatMap(List::stream)
.collect(Collectors.toList())
));
将Collection<List<Node>>
中的地图值展平为List<Node>
几乎肯定不是你想要的,因为它实际上会产生与初始列表相同的结果;如果你确实想得到一个List<Node>
作为结果然后不做任何事情,因为这是初始列表已经提供的。
你肯定需要重新思考你想要完成什么。问问你自己为什么我需要分组才能得到与初始列表相同的结果?一旦你找到答案,也许你会发现你根本不需要这样做,或者可能有其他方法可以更好地完成你的任务。
我没有看到将地图转换回列表的好处,因为您将丢失分组键。你可以做的是通过调用List<Map.Entry<String, List<Node>>>
方法而不是entrySet()
将地图转换回values()
。