[解決済み] ストリームはいつ使うべきですか?
質問
を使用する際に疑問に思ったことがあります。
List
とその
stream()
というメソッドがあります。私が知っている間は
どのように
を使うことは知っていますが、を使うことについてはよく分かっていません。
いつ
についてはよくわかりません。
例えば、異なる場所への様々なパスを含むリストがあるとします。今、私は、単一の与えられたパスがリストで指定されたパスのいずれかを含むかどうかをチェックしたいと思います。私は
boolean
を返したい。
もちろん、これ自体は難しいことではありません。しかし、ストリームを使うべきか、それともfor(-each)ループを使うべきか、悩ましいところです。
リスト
private static final List<String> EXCLUDE_PATHS = Arrays.asList(
"my/path/one",
"my/path/two"
);
Streamを使った例。
private boolean isExcluded(String path) {
return EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.filter(path::contains)
.collect(Collectors.toList())
.size() > 0;
}
for-eachループを使った例。
private boolean isExcluded(String path){
for (String excludePath : EXCLUDE_PATHS) {
if (path.contains(excludePath.toLowerCase())) {
return true;
}
}
return false;
}
なお
path
パラメータは常に
小文字
.
最初に推測したのは、条件が満たされたらループがすぐに戻るので、for-each アプローチの方が速いということです。一方、ストリームはフィルタリングを完了するために、すべてのリスト エントリに対してまだループします。
私の推測は正しいでしょうか。もしそうなら
なぜ
(あるいはむしろ
いつ
を使うか?
stream()
を使うのでしょうか?
どのように解決するのですか?
あなたの仮定は正しいです。ストリームの実装は、for-loopより遅いです。
このストリームの使い方は、for-loopと同じくらい速いはずですが。
EXCLUDE_PATHS.stream()
.map(String::toLowerCase)
.anyMatch(path::contains);
これは、項目を繰り返し、
String::toLowerCase
とフィルタを一個一個適用し
で終了し、最初の項目
で終了します。
どちらも
collect()
&
anyMatch()
は端末操作です。
anyMatch()
は最初に見つかった項目で終了しますが、一方
collect()
は全ての項目を処理することを要求しています。
関連
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ThreadLocal変数はいつ、どのように使用すればよいですか?
-
[解決済み] 可能な限り常にパラレルストリームを使用した方がいいのでしょうか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
-
[解決済み] Java 8 の並列ストリームにおけるカスタムスレッドプール
-
[解決済み] javaストリームで整数のリストを合計する方法は?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】ストリームを使った地図作成で重複を無視する。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
無効な文字定数
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
シェルコマンドやスクリプトのJavaコール
-
Junitのユニットテストはjava.lang.Testを報告します。
-
セミコロン期待値エラー解決
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題