Группировка объектов по двум полям с использованием Java 8 - PullRequest
0 голосов
/ 17 января 2019

У меня проблема с группировкой двух значений с помощью Java 8.

Моя основная проблема заключается в группировке двух полей, я правильно группирую одно поле с именем getNameOfCountryOrRegion(), но теперь меня интересует groupingBy другое поле, котороетакже называется leagueDTO.

Map<String, List<FullCalendarDTO>> result = countryDTOList.stream()
               .collect(Collectors.groupingBy(
                             FullCalendarDTO::getNameOfCountryOrRegion));

И следующий класс:

public class FullCalendarDTO  {
    private long id;
    private TeamDTO localTeam;
    private TeamDTO visitorTeam;
    private LocationDTO location;   
    private String leagueDTO;       
    private String timeStamp;
    private String nameOfCountryOrRegion;
}

Результат будет сгруппирован по nameOfCountryOrRegion и leagueDTO.

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Передача коллектора downstream на groupingBy поможет:

countryDTOList.stream()
              .collect(groupingBy(FullCalendarDTO::getNameOfCountryOrRegion,
                       groupingBy(FullCalendarDTO::getLeagueDTO)));

Приведенный выше фрагмент кода сгруппирует ваши FullCalendarDTO объекты по nameOfCountryOrRegion, затем каждая группа будет сгруппирована по leagueDTO.

Таким образом, возвращенная коллекция будет выглядеть как Map<String, Map<String, List<FullCalendarDTO>>>.

0 голосов
/ 17 января 2019

Если бы вы сгруппировали, используя два атрибута, ваш вывод был бы Map с ключами в качестве первого атрибута , использованного для группировки (getNameOfCountryOrRegion), и значениями снова как Map с ключи как второй атрибут , используемый для группировки (getLeagueDTO), и его значения как List<FullCalendarDTO>, которые сгруппированы на основе указанных ключей.

Это должно выглядеть так:

Map<String, Map<String, List<FullCalendarDTO>>> result = countryDTOList.stream()
        .collect(Collectors.groupingBy(FullCalendarDTO::getNameOfCountryOrRegion,
                Collectors.groupingBy(FullCalendarDTO::getLeagueDTO)));
0 голосов
/ 17 января 2019

Метод класса коллекционеров groupingBy () поддерживает дополнительный коллектор в качестве второго аргумента:

public static <T, K, A, D>    Collector<T, ?, Map<K, D>> groupingBy(Function<? super T, ? extends K> classifier,Collector<? super T, A, D> downstream)

Выше может быть записано в groupBy () два значения

Map<String, List<FullCalendarDTO>> result = countryDTOList.stream().collect(Collectors.groupingBy(FullCalendarDTO::getNameOfCountryOrRegion, Collectors.groupingBy(FullCalendarDTO::getLeagueDTO)));
0 голосов
/ 17 января 2019

Если вы ищете исходный список для группировки в Карту Карт. Ниже приведен фрагмент кода

    List<FullCalendarDTO> arrayList = new ArrayList<FullCalendarDTO>();
    arrayList.add(new FullCalendarDTO("US","A"));
    arrayList.add(new FullCalendarDTO("EU","A"));
    arrayList.add(new FullCalendarDTO("EU","A"));
    arrayList.add(new FullCalendarDTO("US","A"));
    arrayList.add(new FullCalendarDTO("US","B"));

    Map<String, List<FullCalendarDTO>> result = arrayList.stream().collect(Collectors.groupingBy(FullCalendarDTO::getNameOfCountryOrRegion));

    HashMap<String, Map<String, List<FullCalendarDTO>>> finalOutput = new HashMap<String, Map<String, List<FullCalendarDTO>>>();
    for (Entry<String, List<FullCalendarDTO>> fullCalendarDTO : result.entrySet()) {
        Map<String, List<FullCalendarDTO>> collect = fullCalendarDTO.getValue().stream().collect(Collectors.groupingBy(FullCalendarDTO::getLeagueDTO));
        finalOutput.put(fullCalendarDTO.getKey(), collect);
    }

    System.out.println(finalOutput);

Какие выходы

{EU = {A = [EU :: A, EU :: A]}, US = {A = [US :: A, US :: A], B = [US :: B]}}

...