我建议使用LinkedHashMap(它也支持条目的插入顺序)而不是List< Pair>>.使用它,您可以简单地使用Collectors.groupingBy()和Collectors.mapping()来实现:
List> list = ...;
Map> result = list.stream()
.collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new,
Collectors.mapping(Pair::getValue, Collectors.toList())));
但是,如果您确实需要List< Pair>> ;,您可以将地图转换回此位置:
List> list = ...;
List>> 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());
请记住,您使用此解决方案进行了两次迭代(首先是列表,其次是地图).
除此之外,如果您还想删除B的重复项,则可以使用LinkedHashSet(也保留顺序).为此,您只需要更改映射下游收集器即可:
List> list = ...;
Map> result = list.stream()
.collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new,
Collectors.mapping(Pair::getValue, Collectors.toCollection(LinkedHashSet::new))));