如何使用 Java 8 流将列表中的值相乘

新手上路,请多包涵

流中是否有 sum() 等效方法可以执行流中给定值的乘法?

我有一个像这样的整数列表:

 List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5));

我能够得到所有整数的总和,但无法找到可以将值相乘并给出输出的 API。

 listOfIntegers.stream().mapToInt(a -> a).sum();

如果我尝试使用 forEach 来执行此操作,那么我将无法存储结果,因为只允许在其中使用最终变量。

还有其他选择吗?

原文由 user6012245 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

尝试减少流,它应该有所帮助。

喜欢:

 listOfIntegers.stream().reduce(1, (a, b) -> a * b)

链接 提供了有关如何使用 reduce 的更多信息。

原文由 Kishore Bandi 发布,翻译遵循 CC BY-SA 3.0 许可协议

乘以未知数 ints 时要记住的一件事是溢出的可能性。而不是 (a,b) -> a*b ,使用更安全 Math::multiplyExact ,它会在溢出时抛出异常:

 listOfIntegers.stream().mapToInt(x->x).reduce(1, Math::multiplyExact);

或者,您可以通过减少 BigInteger 来容纳较大的结果:

 listOfIntegers.stream()
    .map(BigInteger::valueOf)
    .reduce(BigInteger.ONE, BigInteger::multiply);

带有标识的缩减将返回 1BigInteger.ONE 如果列表为空,这可能不是您想要的。如果您希望处理空列表的情况,请删除 reduce 的第一个参数,然后处理结果 Optional

原文由 Misha 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题