Как бы вы использовали коллекторы для группировки по нескольким полям на 2-м уровне. например:
"someList": {
"firstLevelElementX": {
"secondLevelElementW": 2,
"secondLevelElementZ": 3,
"secondLevelElementK": 7
},
"firstLevelElementY": {
"secondLevelElementW": 1,
"secondLevelElementZ": 3,
"secondLevelElementK": 10
}
}
Я пытался создать класс с элементами secondLevel и группировать по этому классу, но не смог заставить его работать:
@Data
@AllArgsConstructor
public class someClass{
private String firstLevelElement;
private Long secondLevelElementW;
private Long secondLevelElementZ;
private Long secondLevelElementK= 0L;
}
И вот как я это делаю:
Map<String,Map<String,Long>> someList =
events.stream().collect(
Collectors.groupingBy(
someDAO::getFirstLevelElement,
Collectors.groupingBy(
someClass::getSecondLevelFields,
Collectors.counting())
)
);
Существуют некоторые решения, которые предлагают группирование по n-уровням (с использованием цепочки), но я предпочитаю делать его менее сложным и более чистым, если это возможно.
Редактировать
Я попытаюсь привести лучший пример, чтобы уточнить себя, вот список, который у меня есть:
{
"date": "2019-04-08 08:28:01.0",
"source": "maint",
"severity": "HARMLESS",
"site": "USA",
"hostname": "usaHost"
},
{
"date": "2019-04-08 08:28:01.0",
"source": "CPU_Checker",
"severity": "MINOR",
"site": "GERMANY",
"hostname": "germanyHost"
},
{
"date": "2019-04-02 08:28:01.0",
"source": "maint",
"severity": "HARMLESS",
"site": "USA",
"hostname": "anotherUsaHost"
}
Я хочу использовать группирование по 'source' и 'severity' на втором уровне, поэтому вывод должен выглядеть следующим образом:
"eventList": {
"USA": {
"maint": 2,
"HARMLESS": 2
},
"GERMANY": {
"CPU_checker": 1,
"MINOR": 1
}
}