Java 8ストリームのコンテンツをリストに複数回追加するコードを記述する必要がありますし、何が最善の方法なのかわかりません。私はSOに読んだものに基づいて(主にこの質問:How to add elements of a Java8 stream into an existing List)と他の場所で、私は次のオプションにそれを絞り込むました:ストリームから既存のリストに要素を追加するより良い方法はありますか?
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Accumulator<S, T> {
private final Function<S, T> transformation;
private final List<T> internalList = new ArrayList<T>();
public Accumulator(Function<S, T> transformation) {
this.transformation = transformation;
}
public void option1(List<S> newBatch) {
internalList.addAll(newBatch.stream().map(transformation).collect(Collectors.toList()));
}
public void option2(List<S> newBatch) {
newBatch.stream().map(transformation).forEach(internalList::add);
}
}
アイデアは方法が同じインスタンスに対して複数回呼び出されるだろうということですAccumulator
。中間リストを使用し、ストリームの外側でCollection.addAll()
を1回呼び出すか、各要素のストリームからcollection.add()
を呼び出すかのどちらかを選択できます。
関数型プログラミングの精神の中でより多くのオプション2を好む傾向があり、中間リストを作成することは避けられますが、nが大きいときにadd()
をn回呼び出すのではなく、addAll()
を呼び出すと利点があります。
2つのオプションのどちらか一方が他のものよりも大幅に優れていますか?
EDIT:JB Nizetは、すべてのバッチが追加されるまで変換を遅らせる非常に涼しいanswerを持っています。私の場合は、変換がすぐに実行されることが必要です。
PS:私のサンプルコードでは、私は最善の解決策は、完全にその内部リストを避けて、第三ものであろうストリーム
逆アセンブルされたバイトコード(javap)は、 –
早すぎる最適化をしないでください。より洗練されたものを実行し、パフォーマンスの問題に遭遇した場合にのみ、このコードをプロファイラでチェックしてください。 –
私は 'addAll()'を呼び出す利点はないと思います。 – shmosel