Группировка объектов по двум полям с использованием Java 8

Принятый ответ правильный, однако я некоторое время устранял проблему rest api с установкой «узел с модулем iisnode и npm cors», и было неудобно просто включать анонимную аутентификацию для всех пользователей. Поскольку его узловое приложение тегом system.web мало что делает. Я получил следующее дополнение к web.config:

<system.webServer>
<security>
  <requestFiltering>
    <hiddenSegments>
      <add segment="node_modules" />
    </hiddenSegments>
  </requestFiltering>
  <authorization>
    <add accessType="Allow" verbs="OPTIONS" users="?" />
    <add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" />
  </authorization>
</security>
</system.webServer>
8
задан ETO 17 January 2019 в 20:50
поделиться

4 ответа

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

    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]}}

0
ответ дан Akshay 17 January 2019 в 20:50
поделиться

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

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

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

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

0
ответ дан ETO 17 January 2019 в 20:50
поделиться

Если бы вам нужно было сгруппировать, используя два атрибута, ваш вывод был бы 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
ответ дан Naman 17 January 2019 в 20:50
поделиться

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

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
ответ дан JavaBuddy 17 January 2019 в 20:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: