2017-03-28 13 views
5

私はJavaでストリームを使用するのが初めてです。ここで私の質問です。 私は要素の合計を実行したいdouble [] []を持っています。そのためには、C#Linqに似ていますが、それに続いてaproachがありますが、動作していないようです。2D配列ストリームをJavaで減らす

Arrays.stream(myArray).reduce(0,(acc, i) -> acc + Arrays.stream(i).sum()); 

誤差はaccがdouble []と思われるので、double [] + doubleを実行できません。 C#Linqでは、アキュムレータはシードと同じ型(この場合は0)であるとみなされます。私は何が足りないのですか? ありがとうございます。

答えて

5

reduceの署名を見ると、アイデンティティのタイプはストリームの要素のタイプでなければなりません。この場合、double[]となります。それはaccのタイプにdouble[]を与えるでしょう。

は、さまざまなタイプのアキュムレータを供給することができ、過負荷がありますが、あなたはまた、2つのアキュムレータを組み合わせて、コンバイナを渡す必要があります。

あなたはこれを行うことができます。

double result = Arrays.stream(myArray) 
    .reduce(0D, (acc, i) -> acc + Arrays.stream(i).sum(), Double::sum); 

0Dはリテラルdoubleあり、そしてDouble::sumは2つのアキュムレータを組み合わせるために使用される場合。

また、それはこれを実行する方が便利かもしれません。感謝の

double result = Arrays.stream(myArray) 
    .flatMapToDouble(DoubleStream::of) 
    .sum(); 
+0

多く、私は今、それを理解しました。 – BoRDeX

+1

flatMapは最もクリーンな方法です。 –

+0

私が好む 'Arrays.stream(MyArrayという).flatMapToDouble(配列::ストリーム).SUM();'これは、可変引数のユースケースはないからです。そして、 'Arrays :: stream'は' DoubleStream :: of'よりも短くなります... – Holger