Откуда вы можете упростить свой код, используя groupingBy
:
Map<Item, List<Owner>> map = owners.stream()
.flatMap(Owner::getPairStream)
.collect(Collectors.groupingBy(Pair::getItem,
Collectors.mapping(Pair::getOwner,
Collectors.toList())));
Вы также можете отказаться от класса Pair
, используя SimpleEntry
:
Map<Item, List<Owner>> map = owners.stream()
.flatMap(owner -> owner.getItems()
.stream()
.map(item -> new AbstractMap.SimpleEntry<>(item, owner)))
.collect(Collectors.groupingBy(Entry::getKey,
Collectors.mapping(Entry::getValue,
Collectors.toList())));
Обратите внимание , что я предполагаю, что Item
имеет equals
и hashCode
, соответственно переопределенные.
Примечания:
- Вы можетеиспользуйте
map.merge
вместо последовательных вызовов map.computeIfPresent
и map.computeIfAbsent
HashMap
и parallelStream
для создания плохой комбинации (HashMap
не является поточно-ориентированным)