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

38 java java-8 java-stream

流中是否有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的更多信息.

  • 当然,不需要首先打包值:`IntStream.of(1,4,2,7,5).reduce(1,(a,b) - > a*b)` (7认同)
  • 如果您愿意获得“Optional”,那么您可以将第一个参数删除为“reduce”。 (2认同)

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.