まめログ

Javaプログラマの歩み

【Java】Listから条件に一致した要素だけを抽出する方法(ArrayList, Stream API)

Listに格納された要素の中からある条件に一致した要素だけを抽出したい場面がよくあります。
その際にはfor文とif文を使う方法、Stream APIのfilterメソッドを使う方法などがあります。

for文を使って条件に一致した要素を抽出する

String型のListから要素を抽出する方法を見てみます。

 //コレクション変数の宣言と初期化
 List<String> names = new ArrayList<>();
 //要素の追加
 names.add("白石麻衣");
 names.add("生田絵梨花");
 names.add("松村沙友理");

コレクションから条件に一致する要素を抽出するには、
コレクションの要素すべてを条件と比較し、条件に一致したもののみを格納する新たなコレクションを作ることで実現できます。

//結果格納用のコレクションの宣言
List<String> matched = new ArrayList<>();
//for文でコレクション内の要素すべてを条件と比較する
for (int i = 0; i < names.size(); i++) {
    //"白"で始まる要素かどうかを判定する
    if(names.get(i).startsWith("白")){
        //条件に一致した場合、結果格納用のコレクションに要素を追加する
        matched.add(names.get(i));
    }
}
//抽出された項目をコンソールに出力
for(String name : matched){
    System.out.println("条件一致 : " + name);
}

Stream APIを使って条件に一致した項目を抽出する

Stream APIを使うと、先程の抽出処理を簡単に記述することが出来ます。
抽出対象のコレクションは先程と同じものを使います。

 //コレクション変数の宣言と初期化
 List<String> names = new ArrayList<>();
 //要素の追加
 names.add("白石麻衣");
 names.add("生田絵梨花");
 names.add("松村沙友理");
//filterメソッドで抽出する条件を記述する
List<String> matched = names.stream().filter(n -> n.startsWith("白")).toList();

また、抽出した結果をそのままコンソールに出力するだけであれば、
格納用の変数を用意することなく、forEachメソッドをつなげることで一行で完結させることが出来ます。

names.stream().filter(n -> n.startsWith("白")).forEach(n -> System.out.println("条件一致 : " + n));