2016-04-25 4 views
29

Gibt es eine sum() äquivalente Methode im Stream, die Multiplikation von Werten in einem Stream durchführen kann?Wie multipliziert man Werte in einer Liste mit Java 8 Streams

Ich habe eine Liste von ganzen Zahlen wie folgt aus:

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

Ich bin in der Lage, die Summe aller Zahlen zu bekommen, aber nicht in der Lage eine API zu finden, die die Werte vermehren können und die Ausgabe geben.

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

Wenn ich versuche, forEach zu verwenden, es zu tun, dann kann ich das Ergebnis nicht speichern, da nur endgültige Variablen im Inneren verwendet werden dürfen.

Gibt es eine Alternative dazu?

+0

Schauen Sie sich diesen Link an, Sie erhalten wahrscheinlich Ihre Antwort. http://codereview.stackexchange.com/questions/78484/multiplying-corresponding-integers-using-streams –

Antwort

37

Versuchen Sie, Streams zu reduzieren, sollte es helfen.

Like:

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

Diese link bietet weitere Informationen, wie reduzieren zu verwenden.

+6

Natürlich müssen die Werte nicht zuerst in die Box geschrieben werden: 'IntStream.of (1,4,2,7 , 5) .reduce (1, (a, b) -> a * b) ' – Andreas

+0

@Andreas Vereinbart. Da die Liste bereits verfügbar war, habe ich Stream verwendet. Karthik als Andreas hat vorgeschlagen, dass Sie IntStream direkt verwenden können, wenn Sie die Werte haben. –

+1

Wenn es Ihnen gelingt, ein 'Optional' zu erhalten, können Sie das erste Argument auf' reduce' reduzieren. – Zirak

28

Bei der Multiplikation einer unbekannten Zahl von ints ist die Möglichkeit von Überläufen zu beachten. Anstatt (a,b) -> a*b, ist es sicherer, Math::multiplyExact zu verwenden, die eine Ausnahme bei Überlauf werfen:

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

Alternativ können Sie durch die Reduzierung auf BigInteger große Ergebnisse aufnehmen:

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

Reduktion mit einer Identität Geben Sie 1 oder BigInteger.ONE zurück, wenn die Liste leer ist, was möglicherweise nicht das ist, was Sie möchten. Wenn Sie den Fall einer leeren Liste behandeln möchten, entfernen Sie das erste Argument zu reduce und behandeln Sie dann das resultierende Optional.

Verwandte Themen