最近StreamAPIを使うのが楽しくていろんなユースケースを試しています。
今回はタイトル通りListから特定の条件のものをフィルタリングして取り出してみる。
やりたいこと
List内の要素から一定の条件にあるものを取り出して新しいListを作りたい
サンプルコード
まずは完成系のコードをみてみよう。
わからなくても大丈夫。
/**
* Aから始まる名前だけのListを新たに作成する
* @param names
* @return
*/
public static List<String> filter(List<String> names) {
//①Predicate関数
Predicate<String> startsWithA = name -> name.startsWith("A");
List<String> filterdNames = names.stream()
.filter(startsWithA) //②Stream.filter()メソッド
.collect(Collectors.toList());
return filterdNames;
}
①Predicate関数について
Predicate関数は引数を1つ受け取り、booleanで条件にあっているかを返してくれる関数です。
作った関数をfilter()メソッドの引数として渡して使います。
例えば指定された文字列と等しいかどうかをチェックしたい時
//文字列"Bob"に等しいかチェックするPredicate
Predicate<String> isBob = Predicate.isEqual("Bob");
指定された文字列でない場合をチェックしたい時
//文字列"Alice"でないかチェックするPredicate
Predicate<String> isNotAlice = Predicate.not(Predicate.isEqual("Alice"));
ラムダ式を使えばカスタムのPredicateを作成することもできる。
//文字列が"A"で始まるかどうかチェックする
Predicate<String> startsWithA = name -> name.startsWith("A");
②Stream.filter()について
Stream.filter()メソッドは、ストリームの各要素に対して指定されたPredicate関数(フィルタリングする条件)を適用し、その関数がtrueを返す要素のみを含む新しいストリームを返してくれる。
つまり、filter()メソッドの引数にフィルタリングする条件を書いたPredicate関数を入れればその条件でフィルタリングしてくれるメソッドです。
応用:複数のPredicateを組み合わせる
応用としてand()で複数のPredicateを組み合わせて複数条件でフィルタリングすることもできる。
使い方はシンプルだから特に迷うことなく直感的に使えると思う。
public static List<String> filter2(List<String> names) {
// 文字列が "A" で始まり、かつ長さが5文字以上かどうかをチェックする Predicate
Predicate<String> startsWithA = name -> name.startsWith("A");
Predicate<String> lengthGreaterThan4 = name -> name.length() > 4;
// 複数の Predicate を and で組み合わせる
List<String> result = names.stream()
.filter(startsWithA.and(lengthGreaterThan4))
.collect(Collectors.toList());
return result;
}
今回の内容は以上です。
一言
StreamAPI学べば学ぶほど便利だ・・・
Javaもちゃんと知識アップデートしていかないと置いていかれるししっかり勉強しなきゃ
コメント