1. 導入:なぜfilterが重要なのか
Javaでプログラミングをしていると、「リストの中から特定の条件を満たすデータだけを取り出したい」という場面に頻繁に遭遇します。昔ながらのfor文とif文を使った書き方でも実現は可能ですが、コードが長くなり、何をしているのか意図が読み取りにくくなりがちです。
Java 8から導入されたStream APIの「filter」メソッドを使えば、この処理を宣言的に、つまり「何をしたいか」を書くだけで非常に簡潔に表現できます。コードの可読性を高め、バグを減らすために必須のスキルです。
2. 基礎知識:StreamとPredicateとは
まず、Stream APIは、コレクション(ListやSetなど)のデータを「流れ」として扱い、加工や集計を効率的に行う仕組みです。
次に、filterメソッドの引数として渡すPredicate(プレディケート)は、「真偽値(true/false)を返す関数型インターフェース」です。簡単に言えば、「その要素が条件を満たしているか?」を判定するためのルールを記述するものです。
3. 実装・解決策
filterメソッドは、リストの各要素に対してPredicateを適用し、結果が「true」になった要素だけを新しいStreamとして抽出します。
手順は以下の3ステップです。
1. コレクションをStreamに変換する(.stream())
2. filterを使って条件を指定する(.filter(x -> 条件式))
3. 結果を再度リスト等にまとめる(.collect(Collectors.toList())など)
4. サンプルプログラム
以下のコードは、名前のリストから「S」で始まる名前だけを抽出する例です。そのままコピーして動作を確認してみてください。
import java.util.List;
import java.util.stream.Collectors;
public class FilterExample {
public static void main(String[] args) {
// 名前が入ったリストを作成
List
// "S"で始まる名前だけを抽出する処理
List
// filter内ではPredicate(条件)を指定します
.filter(name -> name.startsWith("S"))
// 抽出した結果をリストとして収集します
.collect(Collectors.toList());
// 結果を出力: [Suzuki, Sato]
System.out.println("絞り込み結果: " + filteredNames);
}
}
5. 応用・注意点
現場で使う際に注意すべき点が2つあります。
一つ目は「Streamは使い捨て」ということです。一度collectなどで終端処理を行うと、そのStreamは閉じられます。同じリストを何度もフィルタリングしたい場合は、毎回.stream()を呼び出してください。
二つ目は「副作用を避ける」ことです。filterの中でリストの中身を書き換えたり、外部の変数を変更したりするのは厳禁です。filterは「あくまで条件に合うものを選ぶだけ」という純粋な役割に徹させるのが、Javaプログラミングの鉄則です。
また、Java 21以降で導入されたSequenced Collections(ListやSetの順序を扱う新機能)と組み合わせる際も、Stream APIは強力な武器になります。まずは単純なListの絞り込みから練習し、慣れてきたら複雑な条件分岐にも挑戦してみてください。

コメント