Java 8 ストリーム: 複数のフィルターと複雑な条件 質問する

Java 8 ストリーム: 複数のフィルターと複雑な条件 質問する

Stream複数の条件でフィルタリングしたい場合があります。

myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...

または、複雑な条件と単一の filterを使って同じことを行うこともできます。

myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...

私の推測では、2 番目のアプローチの方がパフォーマンス特性が優れていると思われますが、それはわかりません。

最初のアプローチは読みやすさでは勝りますが、パフォーマンスの点ではどちらが優れているでしょうか?

ベストアンサー1

両方の選択肢で実行する必要があるコードは非常に似ているため、結果を確実に予測することはできません。基礎となるオブジェクト構造は異なる場合がありますが、ホットスポット オプティマイザーにとっては問題ではありません。したがって、違いがある場合は、より高速な実行につながるその他の周囲の条件に依存します。

2 つのフィルター インスタンスを組み合わせると、より多くのオブジェクトが作成され、したがって委任コードも増えますが、ラムダ式ではなくメソッド参照 (例: replace filter(x -> x.isCool())by )を使用すると、この状況が変わる可能性がありますfilter(ItemType::isCool)。この方法では、ラムダ式用に作成された合成委任メソッドが排除されます。そのため、2 つのメソッド参照を使用して 2 つのフィルターを組み合わせると、filterを含むラムダ式を使用した単一の呼び出しと同じかそれ以下の委任コードが作成される可能性があります&&

しかし、前述のように、この種のオーバーヘッドは HotSpot オプティマイザーによって排除されるため、無視できる程度です。

理論上は、1 つのフィルターよりも 2 つのフィルターの方が並列化しやすいですが、これは計算負荷の高いタスク¹ にのみ関係します。

したがって、簡単な答えはありません。

要するに、臭気検出閾値以下のパフォーマンスの違いについては考えないでください。より読みやすいものを使用してください。


¹…後続のステージを並列処理する実装が必要になりますが、これは現在標準的なストリーム実装では採用されていない方法です。

おすすめ記事