【问题标题】:How to Group By and then toMap streams如何 Group By 然后 toMap 流
【发布时间】:2019-04-30 14:29:23
【问题描述】:

我有我想按 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 作为地图的键是没有意义的...您可以添加示例数据吗?
  • 是的,它可能不会增加价值,但我有一个用例,我最终以这种方式形成地图,以便将其发送到其他预期的服务。
  • 你能展示一个输入数据到输出数据的例子吗@SantoshKsl
  • @SantoshKsl 你试过.collect(groupingBy(A::getA, groupingBy(A::getB, groupingBy(A::getC)))) 吗?
  • 输入数据是平面对象。假设对象 a = 产品,b = 日期,c = 名称。而且我有一个单独的配置,例如相同的名称配置,例如 name1 可以等效于 { name 3 , name 4} 同样 name 5 -> {name 6, name7} 。因此,根据示例,我按产品和日期分组。现在我试图为给定名称(即 c)获取它的所有等效名称。所以按 c 分组,想把它们都收集起来。

标签: java java-8 java-stream


【解决方案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"}
      ]
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多