Java 如何分组然后映射流

Java 如何分组然后映射流,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个对象列表,我想按2列对其进行分组,然后使用toMap收集所有值 假设我有一个具有5个属性的对象。类别A(A,b,c,d,e)和这些对象的列表称为列表。我想要实现的是按a,b分组,创建一个键为c的地图,以及包括它在内的所有对象 //Expected format of output map: Map<a, Map<b, Map<c, List<A>> myMap = new HashMap<>(); myMap = list.stream

我有一个对象列表,我想按2列对其进行分组,然后使用toMap收集所有值

假设我有一个具有5个属性的对象。类别A(A,b,c,d,e)和这些对象的列表称为列表。我想要实现的是按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.
//输出映射的预期格式:

映射如果我理解您的问题,您希望将所有值按
a
b
分组,然后以
c
作为键填充此列表作为映射

您可以通过以下方式实现此目的:

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"}
      ]
    }
  }
}

如果我理解您的问题,您希望将所有值按
a
b
分组,然后以
c
作为键填充此列表作为映射

您可以通过以下方式实现此目的:

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"}
      ]
    }
  }
}

(a,b)
分组而将
c
作为地图的键是没有意义的。。。您可以添加示例数据吗?是的,它可能不会添加值,但我有一个用例,我最终以这种方式形成地图,以便将其发送到其他预期的服务。您可以显示一个示例,其中包含输入数据到输出数据吗@SantoshKsl@SantoshKsl你试过
.collect(groupingBy)吗(A::getC))
?输入数据是平面对象。假设在对象中A=product,b=date,c=name。我有一个单独的配置,比如说,name1可以等价于{name 3,name 4}类似的name 5->{name 6,name 7}.因此,根据我们的示例,我已按产品和日期进行分组。现在,我试图为给定名称(即c)获取它,并映射其所有等效名称。因此,按c分组并希望收集所有名称。按
(a,b)分组没有意义
但仍将
c
作为地图的键…您可以添加示例数据吗?是的,它可能不会添加值,但我有一个用例,我最终以这种方式形成地图,以便将其发送给其他预期服务。您能举一个示例,用输入数据输出数据吗@SantoshKsl@SantoshKsl你试过
.coll吗ect(groupingBy(A::getA,groupingBy(A::getB,groupingBy(A::getC)))
?输入数据是平面对象。假设对象A=product,b=date,c=name。我有一个单独的配置,比如说,name1可以等价于{Name3,Name4}类似的名称5->{Name6,name7}根据我们的例子,我已经按产品和日期进行了分组。现在,我试图为一个给定的名称(即c)得到它,映射它的所有等价名称。所以,按c分组,并希望收集所有名称。
{
  "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"}
      ]
    }
  }
}