ホームページ >Java >&#&チュートリアル >Java 8 Stream Foreachから休憩または戻ってきますか?

Java 8 Stream Foreachから休憩または戻ってきますか?

Barbara Streisand
Barbara Streisandオリジナル
2025-02-07 12:09:11979ブラウズ

Break or return from Java 8 stream forEach?

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は、forEach操作から中断または戻る方法です。

従来のループにより、早期中断や戻りが可能になりますが、StreamのforEachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。

さらなる読み取り:JavaストリームAPIの改善

ストリームforeachを理解

forEachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。各要素を処理するように設計されています。 break return 上記の例では、リスト内の各名前を印刷します。しかし、「ボブ」が表示されたときに処理を停止したい場合はどうでしょうか?

<code class="language-java">List<string> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(name -> {
    System.out.println(name);
});</string></code>
なぜ休憩や戻ってくることができないのですか?

forEach

は従来のループ構造を使用していないため、その中のLambda式では

または

ステートメントは許可されていません。 Lambda式内の

ステートメントは、Lambda式自体のみを終了し、forEachまたはその囲まれた方法を終了しません。 breakまたはcontinueを使用しようとすると、コンパイルエラーが発生します。 return forEach代替方法break continue 1を使用してください

<code class="language-java">names.stream().forEach(name -> {
    if (name.equals("Bob")) {
        break; // 编译错误
    }
});</code>
ループが中断するために必要な場合、クラシック

ループは効果的で、多くの場合最良のオプションです。

2

forメソッドは、条件が満たされると、ストリーム処理が短絡することを意味します。

<code class="language-java">for (String name : names) {
    if (name.equals("Bob")) {
        break;
    }
    System.out.println(name);
}</code>

3

Java 9以降を使用している場合は、

メソッドを使用して、特定の条件が満たされるまで要素を処理できます。 anyMatch()

<code class="language-java">boolean found = names.stream().anyMatch(name -> {
    if (name.equals("Bob")) {
        // 执行操作
        System.out.println("找到Bob");
        return true; // 这将使Stream短路
    }
    System.out.println(name);
    return false;
});</code>
4を使用します(推奨されません)

技術的には、例外をスローするために

メソッドを終了できますが、これは推奨されません。 takeWhile

<code class="language-java">names.stream()
     .takeWhile(name -> !name.equals("Bob"))
     .forEach(System.out::println);</code>
5カスタムスプレタ

カスタムを使用して、ストリーム処理をより詳細に制御しますが、複雑さを追加する犠牲を払っています。

適切な方法を選択

を選択します
  • シンプルさ:早めに終了する必要がある場合は、従来のサイクル方法が簡単です。
  • 機能的スタイル:機能的なプログラミングのパラダイムから逸脱したくない場合はanyMatchnoneMatchtakeWhile(Java 9)メソッドがより適切かもしれません。
  • パフォーマンス:特に大規模なデータセットを操作する場合、各メソッドのパフォーマンスへの影響を考慮する必要があります。

結論

Java 8 Streamのメソッドは、従来のループのように

またはの使用を許可していませんが、この制限をバイパスする方法はいくつかあります。これらの方法を理解することは、実際の状況に基づいて最適なオプションを選択するのに役立ちます。 forEach

以上がJava 8 Stream Foreachから休憩または戻ってきますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。