Как сгруппировать объекты по двум полям во внутреннем классе - PullRequest
1 голос
/ 06 февраля 2020

Пожалуйста, помогите мне сгруппировать объекты с внутренним объектом по двум полям.

У меня есть List<Man>, и мне нужно сгруппировать их по двум встроенным полям адресного объекта? Я хочу получить следующую структуру в ответе Map<String, Map<String, List<Man>>>, где первая строка - город, а вторая строка - улица

public class Man {
  private String name;
  private Address address;

  public Man(String name, Address address) {
        this.name = name;
        this.address = address;
    }
}

public class Address {
  private String city;
  private String street;

  public Address(String city, String street) {
        this.city = city;
        this.street = street;
    }
}


public static void main(String[] args) {
        List<Man> mans = new ArrayList<>();
        mans.add(new Man("Jonh", new Address("NY", "123 street")));
        mans.add(new Man("Alex", new Address("Denver", "6 street")));
        mans.add(new Man("Kate", new Address("NY", "123 street")));
        mans.add(new Man("Mary", new Address("Denver", "12 street")));

  //How can I get the following answer? 
  //Map<String, Map<String, List<Man>>>,  where first string is a city, and second string is street 

  // NY -
  //     |
  //     "123 street" - 
  //                  |
  //                   Man(Jonh...)
  //                   Man(Kate...)
  // Denver -
  //         |
  //         "6 street" -
  //                    |
  //                    Man(Alex...)
  //         |
  //          "12 street" -
  //                       |
  //                       Man(Mary...)

}

Ответы [ 3 ]

4 голосов
/ 06 февраля 2020

Вы можете использовать вложенную группировку с лямбдами для следующих задач:

Map<String, Map<String, List<Man>>> output = mans.stream()
        .collect(Collectors.groupingBy(m ->m.getAddress().getCity(), 
                Collectors.groupingBy(m -> m.getAddress().getStreet())));
1 голос
/ 06 февраля 2020

Вы можете использовать вложенные Collectors.groupingBy:

mans.stream()
    .collect(Collectors.groupingBy(
        m -> m.getAddress().getCity(), 
        Collectors.groupingBy(m -> m.getAddress().getStreet())))

Результат:

{
    Denver={
        6 street=[Man@7791a895], 
        12 street=[Man@3a5ed7a6]
}, 
    NY={
        123 street=[Man@6325a3ee, Man@1d16f93d]
    }
}
0 голосов
/ 06 февраля 2020
Map<String, Map<String, List<Man>>> output = mans.stream()
    .collect(Collectors.groupingBy(man ->man.getAddress().getCity(), 
            Collectors.groupingBy(m -> m.getAddress().getStreet())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...