Принятый ответ правильный, однако я некоторое время устранял проблему 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>
Если вы ищете исходный список для группировки в Карту Карт. Ниже приведен фрагмент кода
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]}}
Передача коллектора downstream
в groupingBy
поможет:
countryDTOList.stream()
.collect(groupingBy(FullCalendarDTO::getNameOfCountryOrRegion,
groupingBy(FullCalendarDTO::getLeagueDTO)));
Приведенный выше фрагмент кода сгруппирует ваши FullCalendarDTO
объекты по nameOfCountryOrRegion
, после чего каждая группа будет сгруппирована по [ 115].
Таким образом, возвращенная коллекция будет выглядеть как Map<String, Map<String, List<FullCalendarDTO>>>
.
Если бы вам нужно было сгруппировать, используя два атрибута, ваш вывод был бы Map
с ключами в качестве первого атрибута , использованного для группировки (getNameOfCountryOrRegion
), и значениями снова как Map
с ключи как второй атрибут , используемый для группировки (getLeagueDTO
) и его значения как List<FullCalendarDTO>
, которые сгруппированы на основе указанных ключей.
Это будет выглядеть так:
Map<String, Map<String, List<FullCalendarDTO>>> result = countryDTOList.stream()
.collect(Collectors.groupingBy(FullCalendarDTO::getNameOfCountryOrRegion,
Collectors.groupingBy(FullCalendarDTO::getLeagueDTO)));
Метод класса коллекционеров 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)));