使用流基于键值将List <pair <a,b >>合并到List <pair <a,list <b >>>

时间:2019-05-18 22:24:58

标签: java java-8 java-stream

我现在正在学习Java 8流,我很好奇是否有任何简便的方法可以将List<Pair<A,B>>转换为List<Pair<A,List<B>>>,即通过键合并对的值吗?

我曾经想过使用forEach方法,但效率似乎较低,因为我需要遍历新列表来检查对的键。

1 个答案:

答案 0 :(得分:3)

我建议使用LinkedHashMap(它也支持条目的插入顺序)而不是True。使用它,您可以简单地使用List<Pair<>>Collectors.groupingBy()来实现:

Collectors.mapping()

但是,如果您确实需要List<Pair<A, B>> list = ...; Map<A, List<B>> result = list.stream() .collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new, Collectors.mapping(Pair::getValue, Collectors.toList()))); ,则可以将地图转换回此位置:

List<Pair<>>

请记住,您使用此解决方案进行了两次的迭代(首先是列表,其次是地图)。

除此之外,如果您还想删除List<Pair<A, B>> list = ...; List<Pair<A, List<B>>> result = list.stream() .collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new, Collectors.mapping(Pair::getValue, Collectors.toList()))) .entrySet().stream() .map(e -> new Pair<>(e.getKey(), e.getValue())) .collect(Collectors.toList()); 的重复项,则可以为此使用LinkedHashSet(也保持顺序)。为此,您只需要更改映射下游收集器:

B