2017-02-17 8 views
1

ストリームAPIを使用して単一の値に減らしたいコレクションがあります。 collectまたはreduceがうまくいくように見えますが、どちらもcombinerオブジェクトで並列結果をマージする必要があります。私の場合、私は結合操作を持っていません。結合機能が存在しない場合、ストリームの収集/削除

ストリームには多くの要素が存在しないため、シリアルに実行するのはうれしいです。これを処理する方法はありますか?私のストリームは、1,2および3が含まれている場合

は、私は

result = stream.reduce(new Foo(), 
         (foo, ele) -> foo.foo(ele), 
         null); 

はそううまくいくようだ

result = new Foo().foo(1).foo(2).foo(3); 

と同等のものをやりたいが、いくつかの点で、いくつかの変化(若干長いリスト、新しいJavaバージョン)combinerが呼び出され、それが壊れてしまいます。

私は別のタイプを返すので、reduce(BiFunction)は私のためには機能しません。

+0

フィールドリストをマップの内側の一部を取得するための[java8ストリームスタイルの可能性の重複? ](http://stackoverflow.com/questions/42278737/java8-stream-style-for-retrieving-a-inner-part-of-map-through-a-field-list) – shmosel

+0

あなたが気まぐれでストリームAPIの慈悲でコンバイナを使用するには、単純なループを使用するだけではどうですか? –

+0

@shmoselそれは問題を解決するだろうかと思う。それは、言語によって導入された問題を解決しようとしているように、少し複雑に見えますが。 –

答えて

1

私はコレクションの要素をループを使用します。

Foo result = new Foo(); 
for (int ele : collection) { 
    result = result.foo(ele); 
} 

これは、ストリームのアプローチに似た冗長性の、読みやすい、そしてあなたはその行動が変化する心配する必要はありません予期せずStreamsライブラリの暗いブードゥーのために。

1

あなたがストリームに固執することを好む場合は、ステートフルであることを許可されているとして、あなたはforEachOrderedを使用することができます。

AtomicReference<Foo> foo = new AtomicReference<>(new Foo()); 
stream.forEachOrdered(ele -> foo.updateAndGet(f -> f.foo(ele)));   
Foo result = foo.get(); 
関連する問題