Java 8 Lambda для создания карты, где Value - это объект-оболочка списка - PullRequest
0 голосов
/ 11 мая 2018

У меня есть этот класс адресов со мной в виде списка, и я хотел создать карту с названием улицы в качестве ключа и списком всех объектов адреса в качестве значений, в которые входит название улицы. Предположим, я получил адрес в виде списка, поэтому у меня есть список адресов.

public class Address{
    private String streetName;
    private String city;
    private String country;
    private String zipCode;
    public String getStreetName() {
        return streetName;
    }
    public void setStreetName(String streetName) {
        this.streetName = streetName;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getZipCode() {
        return zipCode;
    }
    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

}

I was able to do this using Lambda with the below Code

Map<String, List<Address>> resultMap =
addressList.stream().collect(Collectors.groupingBy(address-> address.getStreetName())); // This creates Map with street name as key and list of addresses as values

Мне нужно создать оболочку поверх адреса, чтобы она выглядела как

public class AddressWrapper {
     private String streetName;
    private List<Address> addressWrapperList;
    public String getStreetName() {
        return streetName;
    }
    public void setStreetName(String streetName) {
        this.streetName = streetName;
    }
    public List<Address> getAddressWrapperList() {
        return addressWrapperList;
    }
    public void setAddressWrapperList(List<Address> addressWrapperList) {
        this.addressWrapperList= addressWrapperList;
    }
}

Теперь у меня есть addressList, как я могу создать карту, чтобы вместо названия улицы в качестве ключа и списка адресов, принадлежащих этому названию улицы в качестве значения, я хочу создать карту с названием улицы в качестве ключа, но со значением addressWrapperList (который представляет собой список адресов)

1 Ответ

0 голосов
/ 11 мая 2018

Один из способов сделать это - создать поток из результата операции 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;
            }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...