2026年1月17日土曜日

【Modern Java】Stream API 徹底探求:for文から「データの流れ」をデザインする思考へ

1. 導入:Stream APIは「レシピ」である


これまで、データの集まりを処理するには「拡張for文」を使ってきました。しかし、Modern Java(Java 8以降)では Stream API を使うのが標準です。

for文が「1つずつ取り出して、こうして、ああして…」という**「作業手順」を書くのに対し、Stream APIは「これを抽出して、統計を取って、結果を出す」という「料理のレシピ」**を書くような感覚です。

2. 基本コンセプト:3つのステップ


Stream APIが少し難しく感じるのは、複数の処理が繋がっているからかもしれません。しかし、中身は必ずこの3ステップで構成されています。

生成(Source): データの集まり(リストや配列)をStream(川)に流す。

中間操作(Intermediate Operations): フィルタリング(選別)やマップ(変換)を行う。ここではまだ結果は出ません。

終端操作(Terminal Operation): 最終的な結果(合計、最大値、リスト化など)を得る。ここで初めて「川」が閉じられ、処理が実行されます。

3. 実践1:数値配列から統計情報を取得する


まずは、配列の最大値、最小値、平均値を求めてみます。
従来のfor文だと変数をいくつも用意して比較する必要がありますが、Streamなら専用の「統計オブジェクト」を呼び出すだけです。

【検証コード:StreamStats.java】
Java
import java.util.Arrays;
public class StreamStats {
   public static void main(String[] args) {
      int[] scores = {85, 92, 45, 100, 63};
      // 統計情報を一括取得(Arrays.streamで生成し、終端操作へ)
      var stats = Arrays.stream(scores).summaryStatistics();
      System.out.println("最大値: " + stats.getMax());
      System.out.println("最小値: " + stats.getMin());
      System.out.println("平均値: " + stats.getAverage());
   }
}

4. 実践2:条件に合う文字列を抽出して加工する


次に、実務で非常によく使う「条件に合うものを探し、加工してリストにする」パターンです。
【検証コード:StreamFilter.java】
Java
import java.util.List;
import java.util.stream.Collectors;
public class StreamFilter {
   public static void main(String[] args) {
      List languages = List.of("Java", "Python", "JavaScript", "C++", "Ruby");
      // 「J」で始まる言語だけを抽出し、すべて大文字に変換してリスト化する
     List results = languages.stream()
     .filter(s -> s.startsWith("J")) // 中間操作:絞り込み
     .map(String::toUpperCase) // 中間操作:変換
     .collect(Collectors.toList()); // 終端操作:結果の回収(リスト化)
      System.out.println("抽出結果: " + results); // [JAVA, JAVASCRIPT]
   }
}


5. なぜStreamを使うと「わかりやすい」のか?


Stream APIを使う最大のメリットは、「やりたいこと(ビジネスロジック)」がソースコードの見た目(単語)と一致する点にあります。

「filter(選別)」

「map(加工)」

「max(最大)」

コードを見ただけで「何をしているか」が英語の文章のように読めるため、複雑なループ処理の裏側に隠れたバグを見つけるストレスから解放されます。

6. まとめ:10本目の探求を終えて


今回の探求で、Javaは単に堅実なだけでなく、Stream APIのような「表現力の高い、モダンな道具」を兼ね備えていることを実感しました。



0 件のコメント:

コメントを投稿

【Javaアルゴリズム探求】古典暗号「ROTn」の実装:クラス設計とJavaDocで学ぶ「機能の独立」

  1. 導入:暗号の世界への第一歩 セキュリティが不可欠な現代のシステム開発において、暗号の仕組みを理解することは非常に重要です。今回はその入門として、古典暗号の一つである「ROTn(シーザー暗号)」をJavaで実装してみます。 単に動くだけでなく、再利用しやすい「暗号化・復号...