1

我有一个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"
    }]

使用带有 groupBy 方法的 Stream API 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"
    }
  ]
}

这里每个值都是 JSONArray,因为我得到Map<Object, List<Map<String, Object>>>. 有没有办法Map<Object, Map<String, Object>>使用 Stream API 来收集,所以我可以得到一个正确的 JSON(没有 JSONArray 值)

4

1 回答 1

2

您应该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));
于 2016-02-02T16:37:10.723 回答