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();
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント