Existe-t-il une méthode sum () équivalente dans le flux qui peut effectuer la multiplication des valeurs données dans un flux?
J'ai une liste d'entiers comme celui-ci:
List<Integer> listOfIntegers = new ArrayList<>();
listOfIntegers.addAll(Arrays.asList(1,4,2,7,5));
Je peux obtenir la somme de tous les entiers, mais je ne peux pas trouver une API qui peut multiplier les valeurs et donner la sortie.
listOfIntegers.stream().mapToInt(a -> a).sum();
Si j'essaie d'utiliser forEach pour le faire, je ne peux pas stocker le résultat car seules les variables finales peuvent être utilisées à l'intérieur.
Y a-t-il une alternative à cela?
Essayez de réduire les flux, cela devrait aider.
Comme:
listOfIntegers.stream().reduce(1, (a, b) -> a * b)
Cette lien fournit plus d'informations sur la façon d'utiliser la réduction.
Une chose à garder à l'esprit lors de la multiplication d'un nombre inconnu de ints
est la possibilité de débordements. Plutôt que (a,b) -> a*b
, il est plus sûr d'utiliser Math::multiplyExact
, qui lèvera une exception en cas de débordement:
listOfIntegers.stream().mapToInt(x->x).reduce(1, Math::multiplyExact);
Alternativement, vous pouvez accepter de grands résultats en réduisant sur BigInteger
:
listOfIntegers.stream()
.map(BigInteger::valueOf)
.reduce(BigInteger.ONE, BigInteger::multiply);
La réduction avec une identité retournera 1
ou BigInteger.ONE
si la liste est vide, ce n'est peut-être pas ce que vous voulez. Si vous souhaitez gérer la casse d'une liste vide, supprimez le premier argument de reduce
puis traitez le Optional
résultant.