Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 8のStream APIにおける中間操作と終端操作の違い

Java 8で導入されたStream(ストリーム)は、要素を格納するための仕組みではなく、データの集合を効率的に処理するために使用されます。元のコレクション自体は変更されず、パイプラインとして連結されたメソッドに従って結果だけを返します。

Stream APIはさまざまな操作をサポートしており、それらの操作は大きく「中間操作」と「終端操作」の2種類に分類されます。

中間操作(Intermediate Operations)とは

中間操作は、他のメソッドをパイプラインにつなげたり、ストリームを別のストリームへ変換したりするために使用されます。中間操作単体では結果を生成せず、終端操作が実行されるまで実際の処理は行われません(遅延評価)。主な例は以下の通りです。

  • sorted(Comparator<T>)
  • peek(Consumer<T>)
  • distinct()

終端操作(Terminal Operations)とは

終端操作は、ストリームに対して最後のステップとして適用され、最終的な結果を生成するための操作です。終端操作の後にさらにメソッドをチェーンすることはできません。主な例は以下の通りです。

  • forEach
  • count
  • toArray

中間操作と終端操作の比較表

No.項目中間操作終端操作
1基本他のメソッドをパイプラインにつなぎ、ストリームを別のストリームへ変換するために使用されるストリームに対して最後のステップとして適用されるメソッド
2戻り値の型常に別のストリームを返す最終結果を返す
3代表メソッドsorted(Comparator<T>)、peek(Consumer<T>)、distinct()forEach、count、toArray
4主な用途ストリームを別のストリームへ変換・加工する際に使用する集計や出力など、結果を確定させるために使用する

中間操作と終端操作のコード例

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String args[]) {
        List<String> laptopList = new ArrayList<>();
        laptopList.add("DELL");
        laptopList.add("ACER");
        laptopList.add("HCL");

        // 中間操作:sorted() でソート済みの新しいストリームを生成
        // 終端操作:forEach() で各要素を出力
        laptopList.stream()
                  .sorted((p1, p2) -> p1.compareTo(p2))
                  .forEach(a -> System.out.println(a));
    }
}

この例では、sorted()が中間操作として機能し、ソート済みの新しいストリームを返します。ただしこの時点ではまだ処理は実行されず、forEach()という終端操作が呼び出された時点で初めてパイプライン全体の処理が実行され、結果が出力されます。このように、中間操作で流れを作り、終端操作で結果を取り出すのがStream APIの基本的な使い方です。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って