Если я понимаю ваш вопрос, вы хотите сгруппировать все значения по a
и b
, а затем заполнить этот список как карту с ключом c
.
Вы можете достичь этого, используя Collectors.collectingAndThen()
:
Map<String, Map<String, Map<String, List<MyObject>>>> myMap = list.stream()
.collect(Collectors.groupingBy(MyObject::getA,
Collectors.groupingBy(MyObject::getB,
Collectors.collectingAndThen(Collectors.toList(),
l -> l.stream().collect(Collectors.toMap(MyObject::getC, x -> l))
))));
Использование этого списка:
[
{"a": "aaa", "b": "bbb", "c": "ccc", "d": "ddd", "e": "eee"},
{"a": "aaa", "b": "bb", "c": "cc", "d": "ddd", "e": "ee" },
{"a": "aa", "b": "b", "c": "ccc", "d": "d", "e": "e" },
{"a": "aa", "b": "b", "c": "c", "d": "dd", "e": "ee" },
{"a": "aaa", "b": "bb", "c": "c", "d": "dd", "e": "eee"}
]
myMap
будет выглядеть так:
{
"aa": {
"b": {
"ccc": [
{"a": "aa", "b": "b", "c": "ccc", "d": "d", "e": "e" },
{"a": "aa", "b": "b", "c": "c", "d" : "dd", "e" : "ee"}
],
"c": [
{"a": "aa", "b": "b", "c": "ccc", "d": "d", "e": "e" },
{"a": "aa", "b": "b", "c": "c", "d" : "dd", "e" : "ee"}
]
}
},
"aaa": {
"bb": {
"cc": [
{"a": "aaa", "b": "bb", "c": "cc", "d": "ddd", "e": "ee" },
{"a": "aaa", "b": "bb", "c": "c", "d": "dd", "e": "eee"}
],
"c": [
{"a": "aaa", "b": "bb", "c": "cc", "d": "ddd", "e": "ee" },
{"a": "aaa", "b": "bb", "c": "c", "d": "dd", "e": "eee"}
]
},
"bbb": {
"ccc": [
{"a": "aaa", "b": "bbb", "c": "ccc", "d": "ddd", "e": "eee"}
]
}
}
}