テクノロジー 開発 非公開: Java Stream API を学習する方法 [+5 リソース]

Java Stream API を学習する方法 [+5 リソース]

Java のストリームは、逐次操作または並列操作を実行できる一連の要素です。

「n」回の中間操作があり、最後に最終操作があり、その後結果が返されます。

ストリームとは何ですか?

ストリームは、Java 8 で導入された Stream API によって管理できます。

Stream を、いくつかの商品を製造、分類し、出荷のために梱包する必要がある製造パイプラインとして想像してください。 Java では、これらの商品はオブジェクトまたはオブジェクトのコレクションであり、操作は製造、仕分け、梱包であり、パイプラインはストリームです。

ストリームのコンポーネントは次のとおりです。

  • 初期入力
  • 中間操作
  • 端末操作
  • 最終結果

Java のストリームのいくつかの機能を調べてみましょう。

  • ストリームはメモリ内のデータ構造ではありません。むしろ、特定のメソッドによって操作される一連の配列、オブジェクト、またはオブジェクトのコレクションです。
  • ストリームは本質的に宣言型です。つまり、何を行うかを指定しますが、その方法は指定しません。
  • どこにも保存されないため、消費できるのは 1 回だけです。
  • ストリームは元のデータ構造を変更しません。そこから新しい構造を導き出すだけです。
  • パイプラインの最終メソッドから派生した最終結果を返します。

ストリーム API とコレクション処理

コレクションは、データを保存および処理するメモリ内のデータ構造です。コレクションは、データを保存するための Set、Map、List などのデータ構造を提供します。一方、ストリームは、データをパイプラインで処理した後、効率的に転送する方法です。

ArrayList コレクションの例を次に示します。

 import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

上の例でわかるように、ArrayList コレクションを作成し、そこにデータを保存し、さまざまなメソッドを使用してそのデータを操作できます。

ストリームを使用すると、既存のデータ構造を操作して、新しく変更された値を返すことができます。以下は、ArrayList コレクションを作成し、ストリームを使用してフィルタリングする例です。

 import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

上記の例では、既存の list を使用してストリームが作成され、リストが反復処理されて 10 より大きい値がフィルターされます。ストリームには何も保存されず、リストは反復処理されるだけであり、結果が出力されることに注意してください。ストリームを出力しようとすると、値の代わりにストリームへの参照が取得されます。

Java ストリーム API の開発

Java Stream API は、要素のソース コレクションまたは要素のシーケンスを取得し、それらに対して操作を実行して最終結果を導き出します。ストリームは、一連の要素が通過し、何らかの方法で変換される単なるパイプラインです。

ストリームは、次のようなさまざまなソースから作成できます。

  • リストやセットなどのコレクション。
  • 配列。
  • バッファを使用してファイルとそのパスから。

ストリーム内で実行される操作には次の 2 種類があります。

  • 中間操作
  • 端末の操作

中間操作と最終操作

各中間操作は、指定されたメソッドを使用して入力を変換する新しいストリームを内部的に返します。実際には何も通過しません。代わりに、次のストリームに渡されます。望ましい結果を得るためにストリームがトラバースされるのは、最終操作のときだけです。

たとえば、フィルターで除外して何かにマッピングしたい 10 個の数値のリストがあるとします。フィルタリングされた結果を取得し、それを他のものにマッピングするために、リストのすべての要素がすぐに走査されるわけではありません。代わりに、個々の要素がチェックされ、条件を満たしていればマップされます。あらゆる要素の新しいストリーム。

マップ操作は、リスト全体ではなく、フィルターを満たす個々の項目に対して実行されます。そして、最終操作時に、それらは走査され、単一の結果に結合されます。

終了操作を実行すると、ストリームは消費され、それ以上使用できなくなります。同じ操作を再度実行するには、新しいストリームを作成する必要があります。

出典: 退屈な開発者
Javaでのストリームの動作
Javaでのストリームの動作

ストリームがどのように機能するかを表面レベルで理解したら、Java でのストリームの実装の詳細に移りましょう。

#1. 空のストリーム

Stream API の empty メソッドを使用して、空のストリームを作成します。

 import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

#Output
0

ここで、このストリームの要素数を出力すると、要素のない空のストリームであるため、出力として 0 が得られます。空のストリームは、null ポインター例外を回避するのに非常に役立ちます。

#2. コレクションからのストリーム

Lists や Set などのコレクションは、コレクションからストリームを作成できる stream() メソッドを公開します。作成されたストリームを走査して、最終結果を取得できます。

 ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#3. 配列からのストリーム

Arrays.stream() メソッドは、配列からストリームを作成するために使用されます。

 import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", ""};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is  

ストリームを作成する要素の開始インデックスと終了インデックスを指定することもできます。開始インデックスは包括的ですが、終了インデックスは排他的です。

 String[] stringArray = new String[]{"this", "is", ""};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

#Output
this is  

#4. ストリームを使用して最小値と最大値を見つける

コレクションまたは配列の最大数と最小数にアクセスするには、Java のコンパレータを使用します。 min() メソッドと max() メソッドはコンパレータを受け入れ、Optional オブジェクトを返します。

Optional オブジェクトは、null 以外の値を含む場合も含まない場合もあるコンテナ オブジェクトです。 null 以外の値が含まれている場合は、 get() メソッドを呼び出すと値が返されます。

 import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

学習リソース

Java のストリームの基本を理解できたので、Java 8 に精通するための 5 つのリソースを次に示します。

#1. Java 8 の動作

この本は、ストリーム、ラムダ、関数型プログラミングなど、Java 8 の新機能を紹介するガイドです。クイズや知識チェックの質問も本書に含まれており、学んだことを取り戻すのに役立ちます。

プレビュー 製品 評価 価格
Java 8 の実際: Lambdas、Streams、および関数型プログラミング Java 8 の実際: Lambdas、Streams、および関数型プログラミング $39.71

この本は、Amazon でペーパーバック形式とオーディオブック形式で入手できます。

#2. Java 8 Lambdas: 大衆のための関数型プログラミング

この本は、コア Java SE 開発者に、ラムダ式の追加が Java 言語にどのような影響を与えるかを教えることを目的として特別に設計されています。 Java 8 ラムダ式をマスターするための、わかりやすい説明、コード演習、例が含まれています。

プレビュー 製品 評価 価格
Java 8 Lambdas: 大衆のための関数型プログラミング Java 8 Lambdas: 大衆のための関数型プログラミング $24.17

Amazonではペーパーバック版とKindle版が販売されています。

#3. 本当にせっかちな人のための Java SE 8

経験豊富な Java SE 開発者であれば、この本で、Java SE 8 で行われた改善点、ストリーム API、ラムダ式の追加、Java での同時プログラミングの改善点、およびほとんどの人が知らない Java 7 の機能について説明します。については知りません。

プレビュー 製品 評価 価格
本当にせっかちな人のための Java SE 8 本当にせっかちな人のための Java SE 8 $10.63

Amazonではペーパーバック形式でのみ入手可能です。

#4. Lambdas と Streams で Java 関数プログラミングを学ぶ

udemy Javaコース「LambdasとStreamsでJava関数プログラミングを学ぶ」
udemy Javaコース「LambdasとStreamsでJava関数プログラミングを学ぶ」

Udemyによるこのコースでは、Java 8および9の関数型プログラミングの基礎を学びます。ラムダ式、メソッド参照、ストリーム、および関数型インターフェイスがこのコースで焦点を当てる概念です。

また、関数型プログラミングに関連した Java パズルや演習も多数含まれています。

#5. Javaクラスライブラリ

coursera - Java クラス ライブラリ
coursera – Java クラス ライブラリ

Java クラス ライブラリは、 Coursera が提供する Core Java Specialization の一部です。 Java ジェネリックスを使用してタイプセーフなコードを記述する方法、4000 を超えるクラスで構成されるクラス ライブラリを理解する方法、ファイルの操作方法、およびランタイム エラーの処理方法を説明します。ただし、このコースを受講するにはいくつかの前提条件があります。

  • Java の概要
  • Java によるオブジェクト指向プログラミングの概要
  • Java のオブジェクト指向階層

最後の言葉

Java Stream API と Java 8 での Lambda 関数の導入により、並列反復、関数型インターフェイス、コードの削減など、Java の多くのことが簡素化および改善されました。

ただし、ストリームにはいくつかの制限があります。最大の制限は、一度しか消費できないことです。 Java 開発者であれば、上記のリソースはこれらのトピックをさらに詳しく理解するのに役立ちますので、必ずチェックしてください。

Java の例外処理についても知りたいかもしれません。

「 Java Stream API を学習する方法 [+5 リソース]」についてわかりやすく解説!絶対に観るべきベスト2動画

5分でわかる便利Java API InputStream::transferTo
【Web制作】STUDIOでカスタムAPIを使う方法を解説 #ノーコード #起業

Java のストリームは、逐次操作または並列操作を実行できる一連の要素です。

「n」回の中間操作があり、最後に最終操作があり、その後結果が返されます。

ストリームとは何ですか?

ストリームは、Java 8 で導入された Stream API によって管理できます。

Stream を、いくつかの商品を製造、分類し、出荷のために梱包する必要がある製造パイプラインとして想像してください。 Java では、これらの商品はオブジェクトまたはオブジェクトのコレクションであり、操作は製造、仕分け、梱包であり、パイプラインはストリームです。

ストリームのコンポーネントは次のとおりです。

  • 初期入力
  • 中間操作
  • 端末操作
  • 最終結果

Java のストリームのいくつかの機能を調べてみましょう。

  • ストリームはメモリ内のデータ構造ではありません。むしろ、特定のメソッドによって操作される一連の配列、オブジェクト、またはオブジェクトのコレクションです。
  • ストリームは本質的に宣言型です。つまり、何を行うかを指定しますが、その方法は指定しません。
  • どこにも保存されないため、消費できるのは 1 回だけです。
  • ストリームは元のデータ構造を変更しません。そこから新しい構造を導き出すだけです。
  • パイプラインの最終メソッドから派生した最終結果を返します。

ストリーム API とコレクション処理

コレクションは、データを保存および処理するメモリ内のデータ構造です。コレクションは、データを保存するための Set、Map、List などのデータ構造を提供します。一方、ストリームは、データをパイプラインで処理した後、効率的に転送する方法です。

ArrayList コレクションの例を次に示します。

 import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

上の例でわかるように、ArrayList コレクションを作成し、そこにデータを保存し、さまざまなメソッドを使用してそのデータを操作できます。

ストリームを使用すると、既存のデータ構造を操作して、新しく変更された値を返すことができます。以下は、ArrayList コレクションを作成し、ストリームを使用してフィルタリングする例です。

 import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

上記の例では、既存の list を使用してストリームが作成され、リストが反復処理されて 10 より大きい値がフィルターされます。ストリームには何も保存されず、リストは反復処理されるだけであり、結果が出力されることに注意してください。ストリームを出力しようとすると、値の代わりにストリームへの参照が取得されます。

Java ストリーム API の開発

Java Stream API は、要素のソース コレクションまたは要素のシーケンスを取得し、それらに対して操作を実行して最終結果を導き出します。ストリームは、一連の要素が通過し、何らかの方法で変換される単なるパイプラインです。

ストリームは、次のようなさまざまなソースから作成できます。

  • リストやセットなどのコレクション。
  • 配列。
  • バッファを使用してファイルとそのパスから。

ストリーム内で実行される操作には次の 2 種類があります。

  • 中間操作
  • 端末の操作

中間操作と最終操作

各中間操作は、指定されたメソッドを使用して入力を変換する新しいストリームを内部的に返します。実際には何も通過しません。代わりに、次のストリームに渡されます。望ましい結果を得るためにストリームがトラバースされるのは、最終操作のときだけです。

たとえば、フィルターで除外して何かにマッピングしたい 10 個の数値のリストがあるとします。フィルタリングされた結果を取得し、それを他のものにマッピングするために、リストのすべての要素がすぐに走査されるわけではありません。代わりに、個々の要素がチェックされ、条件を満たしていればマップされます。あらゆる要素の新しいストリーム。

マップ操作は、リスト全体ではなく、フィルターを満たす個々の項目に対して実行されます。そして、最終操作時に、それらは走査され、単一の結果に結合されます。

終了操作を実行すると、ストリームは消費され、それ以上使用できなくなります。同じ操作を再度実行するには、新しいストリームを作成する必要があります。

出典: 退屈な開発者
Javaでのストリームの動作
Javaでのストリームの動作

ストリームがどのように機能するかを表面レベルで理解したら、Java でのストリームの実装の詳細に移りましょう。

#1. 空のストリーム

Stream API の empty メソッドを使用して、空のストリームを作成します。

 import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

#Output
0

ここで、このストリームの要素数を出力すると、要素のない空のストリームであるため、出力として 0 が得られます。空のストリームは、null ポインター例外を回避するのに非常に役立ちます。

#2. コレクションからのストリーム

Lists や Set などのコレクションは、コレクションからストリームを作成できる stream() メソッドを公開します。作成されたストリームを走査して、最終結果を取得できます。

 ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#3. 配列からのストリーム

Arrays.stream() メソッドは、配列からストリームを作成するために使用されます。

 import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", ""};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is  

ストリームを作成する要素の開始インデックスと終了インデックスを指定することもできます。開始インデックスは包括的ですが、終了インデックスは排他的です。

 String[] stringArray = new String[]{"this", "is", ""};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

#Output
this is  

#4. ストリームを使用して最小値と最大値を見つける

コレクションまたは配列の最大数と最小数にアクセスするには、Java のコンパレータを使用します。 min() メソッドと max() メソッドはコンパレータを受け入れ、Optional オブジェクトを返します。

Optional オブジェクトは、null 以外の値を含む場合も含まない場合もあるコンテナ オブジェクトです。 null 以外の値が含まれている場合は、 get() メソッドを呼び出すと値が返されます。

 import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

学習リソース

Java のストリームの基本を理解できたので、Java 8 に精通するための 5 つのリソースを次に示します。

#1. Java 8 の動作

この本は、ストリーム、ラムダ、関数型プログラミングなど、Java 8 の新機能を紹介するガイドです。クイズや知識チェックの質問も本書に含まれており、学んだことを取り戻すのに役立ちます。

プレビュー 製品 評価 価格
Java 8 の実際: Lambdas、Streams、および関数型プログラミング Java 8 の実際: Lambdas、Streams、および関数型プログラミング $39.71

この本は、Amazon でペーパーバック形式とオーディオブック形式で入手できます。

#2. Java 8 Lambdas: 大衆のための関数型プログラミング

この本は、コア Java SE 開発者に、ラムダ式の追加が Java 言語にどのような影響を与えるかを教えることを目的として特別に設計されています。 Java 8 ラムダ式をマスターするための、わかりやすい説明、コード演習、例が含まれています。

プレビュー 製品 評価 価格
Java 8 Lambdas: 大衆のための関数型プログラミング Java 8 Lambdas: 大衆のための関数型プログラミング $24.17

Amazonではペーパーバック版とKindle版が販売されています。

#3. 本当にせっかちな人のための Java SE 8

経験豊富な Java SE 開発者であれば、この本で、Java SE 8 で行われた改善点、ストリーム API、ラムダ式の追加、Java での同時プログラミングの改善点、およびほとんどの人が知らない Java 7 の機能について説明します。については知りません。

プレビュー 製品 評価 価格
本当にせっかちな人のための Java SE 8 本当にせっかちな人のための Java SE 8 $10.63

Amazonではペーパーバック形式でのみ入手可能です。

#4. Lambdas と Streams で Java 関数プログラミングを学ぶ

udemy Javaコース「LambdasとStreamsでJava関数プログラミングを学ぶ」
udemy Javaコース「LambdasとStreamsでJava関数プログラミングを学ぶ」

Udemyによるこのコースでは、Java 8および9の関数型プログラミングの基礎を学びます。ラムダ式、メソッド参照、ストリーム、および関数型インターフェイスがこのコースで焦点を当てる概念です。

また、関数型プログラミングに関連した Java パズルや演習も多数含まれています。

#5. Javaクラスライブラリ

coursera - Java クラス ライブラリ
coursera – Java クラス ライブラリ

Java クラス ライブラリは、 Coursera が提供する Core Java Specialization の一部です。 Java ジェネリックスを使用してタイプセーフなコードを記述する方法、4000 を超えるクラスで構成されるクラス ライブラリを理解する方法、ファイルの操作方法、およびランタイム エラーの処理方法を説明します。ただし、このコースを受講するにはいくつかの前提条件があります。

  • Java の概要
  • Java によるオブジェクト指向プログラミングの概要
  • Java のオブジェクト指向階層

最後の言葉

Java Stream API と Java 8 での Lambda 関数の導入により、並列反復、関数型インターフェイス、コードの削減など、Java の多くのことが簡素化および改善されました。

ただし、ストリームにはいくつかの制限があります。最大の制限は、一度しか消費できないことです。 Java 開発者であれば、上記のリソースはこれらのトピックをさらに詳しく理解するのに役立ちますので、必ずチェックしてください。

Java の例外処理についても知りたいかもしれません。

「 Java Stream API を学習する方法 [+5 リソース]」についてわかりやすく解説!絶対に観るべきベスト2動画

5分でわかる便利Java API InputStream::transferTo
【Web制作】STUDIOでカスタムAPIを使う方法を解説 #ノーコード #起業