Java8のStream API filterメソッドを理解するにはPredicateインタフェースを理解する

Java8のStream API filterメソッドを理解するにはPredicateインタフェースを理解する

filterメソッドはマッチする要素のみを抽出するメソッドです。

filterメソッドはPredicateを引数に持ちます。

java.util.function.Predicateインタフェースを見るとtestメソッドが一つだけある関数型インタフェースというやつになります。(@FunctionalInterfaceアノテーションが付与されていること、抽象メソッドが一つのみであること)

@FunctionalInterface
public interface Predicate<T> {

  boolean test(T t);

}

Employeeクラスがあるとします。Predicateクラスを実装します。

Predicate<Employee> func = new Predicate<Employee>() {
  public boolean test(Employee e) {
    return e.getName().startsWith("t");
  }
};

testメソッドは仮引数にEmployeeを持ち、tで始まるnameの場合、trueを返し、それ以外はfalseを返します。

filterの引数にPredicateを渡します。

List<Employee> ret = list.stream().filter(func).collect(Collectors.toList());// 注
ret.forEach(e -> System.out.println(e.getName() + " : " + e.getAge()));

ラムダ式で書く

ラムダ式で書くと以下のように記述できます。

List<Employee> ret = list.stream().filter(e -> e.getName().startsWith("t")).collect(Collectors.toList()); // 注
ret.forEach(e -> System.out.println(e.getName() + " : " + e.getAge()));

testメソッド一つのみなので、testを省略でき、仮引数はEmployeeなのでeはEmployeeを表します。

// ラムダ式の実際のイメージ
public boolean test(Employee e) {
  return e.getName().startsWith("t");
}

Objects.nonNullメソッドを使用する

filterメソッドでnull以外を対象としたい場合にObjects.nonNullメソッドを使用してNullを排除します。

List<Employee> list = new ArrayList<Employee>();
list.add(null);
list.add(new Employee(null, 200));

list.stream()
  .filter(Objects::nonNull) // nullを排除
  .filter(e -> Objects.nonNull(e.getName())) // nameがnullのオブジェクトを排除
  .collect(Collectors.toList()); // 注

Predicate.notメソッドを使用する(java11)

否定形のfilterです。java11から使用できます。

final List<String> list = Arrays.asList("1", "", "3", "4", "");
final long count = list.stream().filter(Predicate.not(String::isEmpty)).count();
System.out.println(count); // 3

Java8のStream API mapメソッドを理解するにはFunctionインタフェースを理解する

注:Java16から以下メソッド追加されました。

.collect(Collectors.toList());

.toList();

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました