[解決済み】Java 8 Streams: 複数のフィルタと複雑な条件の比較
質問
をフィルタリングしたい場合があります。
Stream
を複数の条件で指定します。
myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...
あるいは、同じように複雑な条件と
シングル
filter
:
myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...
私の推測では、2番目のアプローチの方がパフォーマンス特性が優れていると思いますが、私は 知る ということです。
読みやすさでは最初のアプローチが勝りますが、パフォーマンスではどちらが良いのでしょうか?
どのように解決するのか?
両方の選択肢で実行しなければならないコードは非常に似ているため、結果を確実に予測することはできません。基本的なオブジェクト構造は異なるかもしれませんが、ホットスポットオプティマイザにとっては挑戦ではありません。ですから、もし違いがあるとしても、より速く実行できるのは、他の周辺条件によるのです。
2つのフィルターインスタンスを組み合わせると、より多くのオブジェクトが生成されるため、デリゲートコードも増えることになりますが、ラムダ式ではなくメソッド参照を使用すると、この状況は変わります。
filter(x -> x.isCool())
で
filter(ItemType::isCool)
. こうすることで、ラムダ式のために作られた合成デリゲートメソッドを排除することができます。つまり、2つのメソッド参照を使った2つのフィルタを組み合わせても、 1つのメソッドを使った場合と同じかそれ以下のデリゲーションコードになる可能性があります。
filter
というラムダ式で呼び出すと
&&
.
しかし、前述の通り、このようなオーバーヘッドはHotSpotのオプティマイザによって解消され、無視できる程度になります。
理論的には、2つのフィルターは1つのフィルターよりも簡単に並列化できますが、それはかなり計算量の多いタスクにのみ関係します¹。
だから、単純な答えはないんです。
要するに、臭気検知の閾値以下では、そんな性能差は考えなくていいということです。より読みやすいものを使いましょう。
¹...そして、後続のステージの並列処理を行う実装が必要になりますが、これは現在標準のStream実装では行われていない道です。
関連
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Java 8 List<V> を Map<K, V> に変換する。
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] Java 8 Iterable.forEach() vs foreachループ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] 1行目2列目でBEGIN_ARRAYを期待したが、BEGIN_OBJECTだった。
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] JavaFX 同じパッケージ内なのに「場所が必要です。
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない
-
[解決済み] Javaでdoubleをfloatに変換する