web-dev-qa-db-fra.com

Comment multiplier des valeurs dans une liste en utilisant Java 8 flux

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?

37
user6012245

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.

51
Bandi Kishore

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.

34
Misha