如何分组再到toMap流

时间:2019-04-30 14:29:24

标签: java java-8 java-stream

我有一个对象列表,要在其中按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.

1 个答案:

答案 0 :(得分:1)

如果我理解您的问题,则希望将所有值按ab分组,然后使用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"}
      ]
    }
  }
}