我现在正在学习Java 8流,我很好奇是否有任何简便的方法可以将List<Pair<A,B>>
转换为List<Pair<A,List<B>>>
,即通过键合并对的值吗?
我曾经想过使用forEach
方法,但效率似乎较低,因为我需要遍历新列表来检查对的键。
答案 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