我们可以使用 Stream API 的 groupby 将 List<Map<String, Object>> 转换为 Map<Object, Map<String, Object>>

Can we convert List<Map<String, Object>> to Map<Object, Map<String, Object>> using groupby of Stream API

我有一个 List<Map<String, Object>> 这样的列表

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

将流 API 与 groupBy 方法 salesReportForSoldProperty.stream().collect(Collectors.groupingBy(tags -> tags.get("D"))) 结合使用,我能够获取集合 Map<Object, List<Map<String, Object>>>
但是当我尝试创建此集合的 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"
    }
  ]
}

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

您应该改用 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));