tutorial streams maptoint collection java java-8 java-stream

streams - stream maptoint java



Cómo multiplicar valores en una lista usando java 8 streams (2)

¿Hay un método equivalente sum () en la corriente que pueda realizar la multiplicación de los valores dados en una secuencia?

Tengo una lista de enteros como esta:

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

Puedo obtener la suma de todos los enteros, pero no puedo encontrar una API que pueda multiplicar los valores y dar la salida.

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

Si trato de utilizar forEach para hacerlo, entonces no puedo almacenar el resultado ya que solo se permite el uso de variables finales dentro de él.

¿Hay alguna alternativa a esto?


Trate de reducir de arroyos, debería ayudar.

Me gusta:

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

Este link proporciona más información sobre cómo usar reducir.


Una cosa a tener en cuenta al multiplicar un número desconocido de ints es la posibilidad de desbordamientos. En lugar de (a,b) -> a*b , es más seguro usar Math::multiplyExact , que generará una excepción en overflow:

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

Alternativamente, puede acomodar grandes resultados reduciendo en BigInteger :

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

La reducción con una identidad devolverá 1 o BigInteger.ONE si la lista está vacía, lo que puede no ser lo que desea. Si desea manejar el caso de una lista vacía, elimine el primer argumento para reduce y luego trate con la Optional resultante.