【问题标题】:How do I sum the double values of a map stream in streamex?如何在streamex中对映射流的双值求和?
【发布时间】:2016-02-22 15:58:38
【问题描述】:

StreamEx 库似乎真的可以帮助我简洁地编写 Java 8 流,尤其是在考虑映射时(例如,使用 mapKeyValue,而不必手动拆箱映射条目)。

如果我在地图中有一个条目流,在 vanilla Java 8 中,我可以通过这种方式对这些值求和:

someMap.entrySet().stream()
    .mapToDouble(Entry::getValue)
    .sum()

我也可以在 StreamEx 中做到这一点,但我希望在 StreamEx 中看到更好的方法,尽管我能想到的最好方法是:

EntryStream.of(someMap)
    .values()
    .mapToDouble(d -> d)
    .sum();

再好不过了。

我错过了更好的方法吗?

【问题讨论】:

  • 您的解决方案还不错。我真的认为没有理由添加所有可能的快捷方式,如.mapValuesToDouble 等。有时最好强制用户进行两次调用,而不是添加快捷方式的二次数(可能的第一次调用次数 * 可能的第二次调用次数)。

标签: java java-8 java-stream streamex


【解决方案1】:

由于您只对Map 的值感兴趣,因此您可以:

double sum = someMap.values().stream().mapToDouble(d -> d).sum();

使用 Stream API 本身。这会直接从映射的值创建一个Stream<Double>,将其映射到原始DoubleStream 并返回总和。

使用StreamEx,您可以将其简化为:

double sum = DoubleStreamEx.of(someMap.values()).sum();

使用DoubleStreamEx.of 直接获取Collection<Double>


如果您已经拥有EntryStream,那么您将无法拥有比以下更简单的东西:

double sum = entryStream.mapToDouble(Entry::getValue).sum();

【讨论】:

  • 明白,谢谢。但是我已经有一个 EntryStream 并且想用它做点什么。我没有入口流的来源。
  • @GraemeMoss 我明白了。那么你的问题实际上是最简单的方法。我用那个编辑了。
  • @Tunaki,同意。我什至认为不可能添加一些新功能来简化它。
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多