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

2022-08-31 20:08:32

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

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

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

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

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

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

除此之外,还有什么其他选择吗?


答案 1

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

喜欢:

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

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


答案 2

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

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

或者,您可以通过减少以下内容来适应较大的结果:BigInteger

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

使用标识的缩减将返回,或者如果列表为空,则可能不是您想要的。如果希望处理空列表的情况,请删除第一个参数,然后处理生成的 .1BigInteger.ONEreduceOptional


推荐