2016-04-25 11 views
29

ストリームに与えられた値の乗算を実行できるsum()メソッドがストリーム内にありますか?java 8ストリームを使用してリスト内の値を掛ける方法

私はこのような整数のリストをしました:

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

私はすべての整数の合計が、値を乗算して出力を与えることができるAPIを見つけることができませんを取得することができますよ。

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

forEachを使用しようとすると、最終的な変数のみがその内部で使用されるため、結果を格納できません。

これに代わる方法はありますか?

+0

このリンクを調べると、おそらくあなたの答えが得られます。 http://codereview.stackexchange.com/questions/78484/multiplying-corresponding-integers-using-streams –

答えて

37

ストリームを減らすようにしてください。役立つはずです。

同様:

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

このlinkは減らす使用する方法の詳細情報を提供しています。

+6

もちろん、値を最初にボックスする必要はありません。 'IntStream.of(1,4,2,7 、5).reduce(1、(a、b) - > a * b) ' – Andreas

+0

@アンドレアス合意。リストは既に利用可能だったので、私はストリームを利用しました。 AndreasとしてのKarthikは、値を知っていればIntStreamを直接使用できることを示唆しています。 –

+1

'Optional'を取得しても問題なければ、最初の引数を' reduce'にドロップできます。 – Zirak

28

intsの不明な数値を掛けたときに覚えておくべきことの1つは、オーバーフローの可能性です。むしろ(a,b) -> a*bよりも、オーバーフローで例外がスローされますされ、Math::multiplyExactを使用する方が安全です:

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

また、あなたがBigIntegerに減らすことで大きな成果を収容することができます:

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

削減アイデンティティとなりますリストが空の場合は1またはBigInteger.ONEを返します。これはあなたが望むものではない可能性があります。空のリストの大文字小文字を処理する場合は、最初の引数をreduceに移動し、その結果のOptionalを処理します。

関連する問題