我有一个对象列表,要在其中按2列分组,然后使用toMap收集所有值。
让我们说我有一个具有5个属性的对象。类A(a,b,c,d,e)的列表,这些对象的列表称为list。我要实现的是按a,b分组,并创建一个键为c并包含所有对象的地图。
//Expected format of output map:
Map<a, Map<b, Map<c, List<A>> myMap = new HashMap<>();
myMap = list.stream().
.collect(Collectors.groupingBy(A::a,
Collectors.groupingBy(A::b,
Collectors.toMap(A::c, Collectors.toList()))); //-> Here i'm expecting the map's key will be C and values should be all the onces which are grouped by a & b.
答案 0 :(得分:1)
如果我理解您的问题,则希望将所有值按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"}
]
}
}
}