[解決済み] ストリームでJava 8のforeachループを使用して次のアイテムに移動する
質問
Java 8 の foreach のストリームがループの中で次のアイテムに移動しようとする問題があります。のようなコマンドを設定することができません。
continue;
のみです。
return;
が動作しますが、この場合はループから抜けてしまいます。ループ内の次のアイテムに移動したい。どうすればいいのでしょうか?
例(動作しない)。
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).foreach(line -> {
...
if(...)
continue; // this command doesn't working here
});
}
例(動作中)。
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).collect(Collectors.toList());
}
for(String filteredLine : filteredLines){
...
if(...)
continue; // it's working!
}
解決方法は?
使用方法
return;
は正常に動作します。 ループ全体が終了するのを防ぐことはできません。 の現在の反復実行を停止するだけです。
forEach
ループを使用します。
次の小さなプログラムを試してみてください。
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.stream().forEach(str -> {
if (str.equals("b")) return; // only skips this iteration.
System.out.println(str);
});
}
出力します。
a
c
がどのように
return;
に対して実行されます。
b
の繰り返しですが
c
は次のイテレーションで問題なく印刷されます。
なぜこれがうまくいくのでしょうか?
最初にこの動作が直感的でないように見えるのは、私たちが
return
文はメソッド全体の実行を中断させます。 ですから、この場合、私たちは
main
メソッドの実行が全体として停止する。
しかし、理解しておかなければならないのは、次のようなラムダ式であることです。
str -> {
if (str.equals("b")) return;
System.out.println(str);
}
...本当に、それ自身の別個のメソッドとして考慮する必要があります。
main
メソッドの中にあるにもかかわらず、便利なものです。ですから、実際には
return
文はラムダ式の実行を停止させるだけである。
次に理解しなければならないのは、そのことです。
stringList.stream().forEach()
...は、実際には、反復ごとにラムダ式を実行する通常のループを隠しているだけです。
この2点を考慮すると、上記のコードは以下のように等価に書き換えることができます(あくまで教育目的です)。
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
for(String s : stringList) {
lambdaExpressionEquivalent(s);
}
}
private static void lambdaExpressionEquivalent(String str) {
if (str.equals("b")) {
return;
}
System.out.println(str);
}
このquot;less magic"コードに相当するものであれば、スコープが
return
文がより明確になります。
関連
-
[解決済み】スキャナはnext()またはnextFoo()を使用した後、nextLine()をスキップしていますか?)
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
[解決済み] Javaでパラメータの型の横にある3つの点は何を意味するのですか?
-
javaでよく使われる英単語
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Java 8 StreamをArrayに変換する方法は?
-
[解決済み] Java 8 Iterable.forEach() vs foreachループ
-
[解決済み] Java 8 JDK を使用して、Iterable を Stream に変換する
-
[解決済み] Java 8 のストリーム forEach からブレークまたはリターンしますか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
IllegalArgumentException この例外を解決する方法
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
Dateが型に解決できない問題を解決する
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
org.glassfish.jersey.servlet.ServletContainer
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
Exception: java.util.NoSuchElementException: 行が見つかりません