メインコンテンツにスキップ
モジュール 7 · レッスン 2 / 2コース内の 14/14~15 min
モジュールのレッスン (2/2)

ストリームAPI

Java の Stream API を使用すると、関数型プログラミングを利用して、宣言的な方法でオブジェクトのコレクションを処理できます。ストリームはデータを保存しませんが、代わりに操作のパイプラインを通じてソース (リストや配列など) から要素を運びます。

Stream パイプラインは 3 つの部分で構成されます。

  1. ソース (例: list.stream())
  2. 0 個以上の 中間操作 (新しいストリームを返す、例: filter、map)
  3. 端末操作 (最終結果または副作用を生成し、ストリームを閉じます。例: collect、forEach、reduce)

一般的な中間操作

中間操作は遅延的であり、最終操作が呼び出されるまで実行されません。

  • filter(Predicate): ブール条件に基づいて要素をフィルターします。
  • map(Function): 関数を適用して各要素を別のオブジェクトに変換します。
  • sorted(): ストリームの要素を並べ替えます。
Java
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
                             .filter(name -> name.startsWith("M"))
                             .map(name -> name.toUpperCase())
                             .collect(Collectors.toList()); // "MARCO"

共通の端末操作

  • forEach(Consumer): ストリームの各要素に対してアクションを実行します。
  • collect(Collector): ストリームの結果をコンテナー (Collectors.toList() を使用したリストなど) に収集します。
  • reduce(identity, BinaryOperator): Stream 要素を単一の累積値に結合します。
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

自分で試してみてください

運動#java.m7.l2.e1
試行回数: 0読み込み中…

数値ストリームを使用して偶数のみをフィルターし、それらを Evens という名前の新しいリストに収集し、System.out.println を使用して出力するコードを完成させます。

エディターを読み込み中…
ヒントを表示

まず `numbers.stream()` を呼び出し、`.filter(n -> n % 2 == 0)` を追加し、最後に `.collect(Collectors.toList())` で収集します。

3 回の試行後に解決策が利用可能になります

運動#java.m7.l2.e2
試行回数: 0読み込み中…

ストリームを使用して、map を使用して名前リスト内のすべての名前を大文字に変換し、メソッド参照を指定した forEach を使用して 1 つずつ出力します。

エディターを読み込み中…
ヒントを表示

`.map(s -> s.toUpperCase())` の後に端末操作 `.forEach(System.out::println)` を使用します。

3 回の試行後に解決策が利用可能になります

運動#java.m7.l2.e3
試行回数: 0読み込み中…

Stream と初期値 0 でのリデュース端末操作を使用して、数値リスト内のすべての数値の合計を計算して、コードを完成させます。合計を出力します。

エディターを読み込み中…
ヒントを表示

`numbers.stream().reduce(0, (a, b) -> a + b)` を使用し、結果の変数を出力します。

3 回の試行後に解決策が利用可能になります