【问题标题】:Can we convert List<Map<String, Object>> to Map<Object, Map<String, Object>> using groupby of Stream API我们可以使用 Stream API 的 groupby 将 List<Map<String, Object>> 转换为 Map<Object, Map<String, Object>>
【发布时间】:2016-02-03 00:39:43
【问题描述】:

我有一个这样的List&lt;Map&lt;String, Object&gt;&gt; 列表

[{"A": 2616100,
      "B": 2616100,
      "C": 31,
      "D": "Sold Promissory Buyer"
    },
    {
      "A": 101322143.24,
      "B": 50243301.2,
      "C": 569,
      "D": "Auction"
    },
    {
      "A": 72000,
      "B": 93900,
      "C": 1,
      "D": "Sold Third Party"
    }]

使用带有 groupBy 方法 salesReportForSoldProperty.stream().collect(Collectors.groupingBy(tags -&gt; tags.get("D"))) 的 Stream API,我可以得到集合 Map&lt;Object, List&lt;Map&lt;String, Object&gt;&gt;&gt;
但是当我尝试创建这个集合的 JSON 时,我得到了这样的 Json

  {
  "Sold Promissory Buyer": [
    {
      "A": 2616100,
      "B": 2616100,
      "C": 31,
      "D": "Sold Promissory Buyer"
    }
  ],
  "Auction": [
    {
      "A": 101322143.24,
      "B": 50243301.2,
      "C": 569,
      "D": "Auction"
    }
  ],
  "Sold Third Party": [
    {
      "A": 72000,
      "B": 93900,
      "C": 1,
      "D": "Sold Third Party"
    }
  ]
}

这里每个值都是 JSONArray,因为我得到的是Map&lt;Object, List&lt;Map&lt;String, Object&gt;&gt;&gt;。有什么方法可以使用 Stream API 获取Map&lt;Object, Map&lt;String, Object&gt;&gt;collection,所以我可以获得正确的 JSON(没有 JSONArray 值)

【问题讨论】:

    标签: java-8 java-stream collectors


    【解决方案1】:

    您应该改用Collectors.toMap

    salesReportForSoldProperty.stream().collect(
        Collectors.toMap(tags -> tags.get("D"), Function.identity()));
    

    请注意,在这种情况下,如果您的输入包含两个具有相同 "D" 值的元素,您将得到一个 IllegalStateException,因为您不能将两个值放入同一个映射键中。如果要忽略重复项,可以将合并函数指定为第三个参数:

    salesReportForSoldProperty.stream().collect(
        Collectors.toMap(tags -> tags.get("D"), Function.identity(), (a, b) -> a));
    

    【讨论】:

    • 谢谢塔吉尔。我会试试。你能告诉我使用 Function.identity() 需要导入哪个包吗?
    • @SonuGupta, java.util.function
    • 我们也可以修剪空格和'-'构成 Map 的键吗?
    • @SonuGupta,使用正则表达式:tags -&gt; tags.get("D").replaceAll("[\\- ]", "")
    • 谢谢@Tagir 我现在知道了,我们可以对标签应用任何操作,我只需要投射它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多