1. 導入:なぜStream APIが重要なのか
Javaでリストやセットの中身を処理する際、これまではfor文やif文を何度も書いていませんか?「リストから特定の条件のデータだけ抜き出して、加工して、別のリストにまとめたい」といった処理は、コードが長くなりがちで読みづらいという課題がありました。Java 8から導入されたStream APIを使うと、これらの処理をまるで「ベルトコンベア」のような流れで記述でき、コードが劇的に短く、そして直感的になります。
2. 基礎知識:Stream APIとは?
Stream APIは、データの集合(コレクション)を「流れるデータ」として扱い、連続した処理を行うための仕組みです。
主な構成要素は以下の3つです。
・ソース:ListやSetなどのコレクションをStreamに変換します。
・中間操作:filter(絞り込み)やmap(変換)など、データを加工する処理です。何度でもつなげられます。
・終端操作:collect(リストへの変換)やforEach(繰り返し処理)など、最後に結果を取り出す処理です。終端操作を行わないと、中間操作は実行されません。
3. 実装/解決策:ストリームパイプラインの作成手順
ストリームパイプラインは「生成 → 加工 → 結果の取得」という順序で記述します。
例えば、リストの中から「3文字以上の名前だけを抽出し、大文字に変換してリストにする」といった処理も、一行で記述することが可能です。
4. サンプルプログラム
以下のコードは、名前のリストから条件に合うものだけを抽出して加工する基本的なサンプルです。そのままコピーして実行してみてください。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSample {
public static void main(String[] args) {
List names = Arrays.asList("Java", "Go", "Python", "C", "Ruby");
// ストリームパイプラインの構築
List result = names.stream()
// 1. 中間操作: 文字数が3文字以上のものに絞り込む
.filter(name -> name.length() >= 3)
// 2. 中間操作: 文字をすべて大文字に変換する
.map(String::toUpperCase)
// 3. 終端操作: 結果をリストとして収集する
.collect(Collectors.toList());
// 結果の出力
System.out.println("加工後のリスト: " + result);
}
}
5. 応用・注意点:現場で役立つポイント
Stream APIを使う上で、初心者が陥りやすい注意点がいくつかあります。
・一度きりの使い切り:Streamは一度終端操作を行うと、再利用できません。もし同じデータをもう一度処理したい場合は、再度ソース(Listなど)からstream()を呼び出す必要があります。
・副作用を避ける:Stream内の処理(特にラムダ式の中)で、外部の変数値を書き換えるような処理は避けてください。バグの温床になります。Streamは「データの変換」に専念させるのが、綺麗に書くコツです。
・可読性とのバランス:すべてをStreamで書こうとせず、複雑な条件分岐が必要な場合は、あえて従来のfor文を使ったほうが読みやすいこともあります。状況に応じて使い分けましょう。
まずは簡単なfilterやmapから使ってみて、その快適さを体験してみてください!

コメント