流中是否有sum()等效方法,可以执行流中给出的值的乘法?
我有一个像这样的整数列表:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5));
Run Code Online (Sandbox Code Playgroud)
我能够得到所有整数的总和,但无法找到可以乘以值并给出输出的API.
listOfIntegers.stream().mapToInt(a -> a).sum();
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用forEach来执行此操作,那么我无法存储结果,因为只允许在其中使用最终变量.
有没有替代方案?
Ban*_*ore 53
尝试减少流,它应该有所帮助.
喜欢:
listOfIntegers.stream().reduce(1, (a, b) -> a * b)
Run Code Online (Sandbox Code Playgroud)
此链接提供有关如何使用reduce的更多信息.
Mis*_*sha 37
在乘以未知数量时要记住的一件事ints是溢出的可能性.而不是(a,b) -> a*b使用更安全Math::multiplyExact,这会在溢出时抛出异常:
listOfIntegers.stream().mapToInt(x->x).reduce(1, Math::multiplyExact);
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过减少以下内容来容纳大量结果BigInteger:
listOfIntegers.stream()
.map(BigInteger::valueOf)
.reduce(BigInteger.ONE, BigInteger::multiply);
Run Code Online (Sandbox Code Playgroud)
还原身份将返回1或者BigInteger.ONE如果列表是空的,这可能不是你想要的.如果您希望处理空列表的情况,请删除第一个参数reduce,然后处理结果Optional.