ホームページ  >  記事  >  Java  >  Java Streams の端末オペレータと中間オペレータの理解: 主な違いと例

Java Streams の端末オペレータと中間オペレータの理解: 主な違いと例

Barbara Streisand
Barbara Streisandオリジナル
2024-10-11 10:11:02604ブラウズ

Understanding Terminal vs Intermediate Operators in Java Streams: Key Differences and Examples

1. Javaストリームの概要

Java 8 で導入された Java Streams により、一連の要素に対する関数型スタイルの操作が可能になります。これらは、より宣言的で読みやすい方法でデータのコレクションを処理する強力な方法を提供します。

1.1 ターミナルオペレーターとは何ですか?

ターミナル オペレーターは、ストリーム パイプラインの終了をマークする操作です。これらはストリーム内のデータの処理をトリガーし、結果または副作用を生成します。ターミナル オペレーターが呼び出されると、ストリームは消費されたとみなされ、それ以上の操作は実行できなくなります。

端末オペレーターの一般的な例:

  • forEach(): 各要素を反復処理し、アクションを実行します。
  • collect(): ストリームの要素をコレクションまたは他の形式に収集します。
  • reduce(): ストリームの要素を 1 つの結果に結合します。
  • count(): ストリーム内の要素の数をカウントします。

コード例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TerminalOperatorExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // Terminal operator: forEach
        names.stream().forEach(name -> System.out.println("Name: " + name));

        // Terminal operator: collect
        List<String> filteredNames = names.stream()
                                           .filter(name -> name.startsWith("A"))
                                           .collect(Collectors.toList());
        System.out.println("Filtered Names: " + filteredNames);
    }
}

デモ結果:

Name: Alice
Name: Bob
Name: Charlie
Filtered Names: [Alice]

1.2 中間オペレーターとは何ですか?

中間演算子は、ストリームを別のストリームに変換する演算です。端末オペレーターが呼び出されるまで、処理はトリガーされません。これらの演算子は操作のパイプラインを構築するために使用され、効率的なデータ処理と操作が可能になります。

中間演算子の一般的な例:

  • filter(): 述語に基づいて要素をフィルターします。
  • map(): 関数を使用して各要素を変換します。
  • sorted(): コンパレータに従って要素を並べ替えます。
  • distinct(): 重複した要素を削除します。

コード例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class IntermediateOperatorExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Alice");

        // Intermediate operators: filter and map
        List<String> transformedNames = names.stream()
                                              .filter(name -> name.startsWith("A"))
                                              .map(String::toUpperCase)
                                              .distinct()
                                              .collect(Collectors.toList());
        System.out.println("Transformed Names: " + transformedNames);
    }
}

デモ結果:

Transformed Names: [ALICE]

2. 端末オペレーターと中間オペレーターの主な違い

効率的なストリーム処理には、これらの演算子の違いを理解することが重要です。

2.1 目的と機能

  • ターミナル オペレーター : ストリーム パイプラインを終了し、処理をトリガーし、結果または副作用を生成します。これらは、アクションを実行し、ストリームから出力を生成するように設計されています。
  • 中間オペレーター : データに対して処理を実行せずに、ストリームを別のストリームに変換します。これらは、ターミナル オペレーターが呼び出されると実行される操作のパイプラインを作成するために使用されます。

2.2 実行とパフォーマンス

  • ターミナル オペレーター : ストリーム パイプライン全体の処理を引き起こします。これらは 1 回だけ実行され、操作によっては計算コストが高くなる可能性があります。
  • 中間オペレーター : 遅延型で、端末オペレーターが呼び出されるまで処理を実行しません。これにより、不必要な計算を行わずに操作を効率的に連鎖させることができます。

2.3 可変性と状態

  • ターミナルオペレーター : 副作用を生成したり、外部状態を変更したりする可能性があります。たとえば、forEach() は要素をコンソールに出力したり、外部コレクションを更新したりできます。
  • 中間オペレーター : ステートレスであり、外部状態を変更しません。これらはストリーム内のデータのみを処理し、出力として新しいストリームを生成します。

3. 結論

Java ストリームの端末演算子と中間演算子を理解することは、効率的で読みやすいコードを作成するために重要です。ターミナル オペレーターはストリーム処理パイプラインを完成させ、中間オペレーターはパイプラインを構築して変換します。これらの演算子を効果的に活用することで、より宣言的かつ機能的な方法でデータ処理タスクを処理できます。

ご質問がある場合、またはさらに詳しい説明が必要な場合は、お気軽に以下にコメントしてください。

詳細については、 で投稿をご覧ください: Java ストリームの端末と中間オペレーターの理解: 主な違いと例

以上がJava Streams の端末オペレータと中間オペレータの理解: 主な違いと例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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