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) {
Listlanguages = List.of("Java", "Python", "JavaScript", "C++", "Ruby");
// 「J」で始まる言語だけを抽出し、すべて大文字に変換してリスト化する
Listresults = 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 件のコメント:
コメントを投稿