【问题标题】:Stream API sum & collect into a Map流式 API 总和并收集到地图中
【发布时间】:2017-03-06 22:33:34
【问题描述】:

假设你有一张这样的对象地图(尽管想象它更大):

List<Map<String, Object>>

[{
    "rtype": "133",
    "total": 2555
}, {
    "rtype": "133",
    "total": 5553
}, {
    "rtype": "135",
    "total": 100
}]

rtype=133,有两个!

我想用 Streams 做的是:

//result:
//Map<String, Object(or double)>
{"133": 2555+5553, "135": 100} // SUM() of the 133s

我有点难以理解 Collectors 和 groupBy 的工作原理,但我想这可能会用于这种情况。

在 Java 流 API 中编写此代码的正确方法是什么?

我很难找到与地图相似的示例(人们在他们的示例中更多地使用列表)

【问题讨论】:

  • @azurefrog 这是地图列表。
  • 你必须至少尝试过,然后向我们展示你的挣扎,然后我们才能从那里继续。
  • 看起来像 JSON... 使用 POJO 会更容易
  • 是的,我在玩单元测试 .collect(Collectors.toMap( e -> e.get("total"), e -> e.get("rtype")));但求和可能需要 BinaryOperator 部分。
  • 是的,我使用了很多 JSON 不同的客户端应用程序不会总是发送正确的类型。它始终是一个后跟小数点的数字,而不是十亿。

标签: java java-8 java-stream


【解决方案1】:

首先,您确实应该使用正确的类而不是映射。话虽如此,您可以通过以下方式对地图列表进行分组:

Map<String, Double> grouped = maps.stream()
        .collect(Collectors.groupingBy(m -> (String)m.get("rtype"),
                Collectors.summingDouble(m -> ((Number)m.get("total")).doubleValue())));

【讨论】:

  • 看到这是我想象的那种事情,我只是无法弄清楚分组/重复部分。
  • 如果我创建类而不是映射,那么在许多其他方法之间传递时代码将不够通用。我认为我没有时间制作一组适合完整 OOP 的所有用例的类。
  • +1 表示“使用正确的类而不是地图”。如果您的其他方法无法处理,则问题出在您的其他方法中。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多