Один из способов сделать это - создать поток из результата операции groupingBy
и собрать его в Map
, указав функцию сопоставления значений как AddressWrapper
.
Map<String, AddressWrapper> result = addressList.stream()
.collect(Collectors.groupingBy(Address::getStreetName))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> {
AddressWrapper addressWrapper = new AddressWrapper();
addressWrapper.setStreetName(e.getKey());
addressWrapper.setAddressWrapperList(e.getValue());
return addressWrapper;
}));
Вы можете упростить логику сопоставления значений, создав конструктор с подписью public AddressWrapper(String streetName, List<Address> addressWrapperList) {...}
.
. Затем код становится следующим:
Map<String, AddressWrapper> result = addressList.stream()
.collect(Collectors.groupingBy(Address::getStreetName))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> new AddressWrapper(e.getKey(), e.getValue())));
Кроме того, вы также можете достичь того же результата с помощью toMap
коллектор выглядит следующим образом:
Map<String, AddressWrapper> resultSet = addressList.stream()
.collect(Collectors.toMap(Address::getStreetName,
e -> new AddressWrapper(e.getStreetName(),
new ArrayList<>(Collections.singletonList(e))),
(left, right) -> {
left.getAddressWrapperList().addAll(right.getAddressWrapperList());
return left;
}));