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.