Я бы предложил использовать LinkedHashMap
(который также поддерживает порядок вставки записей) вместо 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());
Имейте ввиду, что вы повторяете дважды с этим решением (сначала список, затем карта).
Кроме того, если вы также хотите удалить дубликаты B
, вы можете использовать для этого LinkedHashSet
(который также сохраняет порядок). Для этого вам просто нужно изменить отображающий коллектор ниже по потоку:
List<Pair<A, B>> list = ...;
Map<A, Set<B>> result = list.stream()
.collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new,
Collectors.mapping(Pair::getValue, Collectors.toCollection(LinkedHashSet::new))));