java-negate-predicate-method-reference
Java 11で述語メソッド参照を無効にする
1. 概要
この短いチュートリアルでは、Java 11を使用して_Predicate_メソッド参照を無効にする方法を説明します。
Java 11より前にこれを達成するために直面した制限から始めます。 次に、__Predicate.not()___methodがどのように役立つかを見ていきます。
2. Java 11より前
最初に、Java 11より前の_Predicate_を否定する方法を見てみましょう。
まず、__age __fieldおよび_isAdult()_メソッドを使用して_Person_クラスを作成しましょう。
public class Person {
private static final int ADULT_AGE = 18;
private int age;
public Person(int age) {
this.age = age;
}
public boolean isAdult() {
return age >= ADULT_AGE;
}
}
今、人々のリストがあると想像してみましょう:
List<Person> people = Arrays.asList(
new Person(1),
new Person(18),
new Person(2)
);
そして、すべての成人のものを取得したいです。 Java 8でそれを実現するには、次のことができます。
people.stream()
.filter(Person::isAdult)
.collect(Collectors.toList());
ただし、代わりに非成人の人々を取得したい場合はどうでしょうか? 次に、述部を否定する必要があります。
people.stream()
.filter(person -> !person.isAdult())
.collect(Collectors.toList());
*残念ながら、読みやすいとはいえ、メソッド参照を手放すことを余儀なくされています。*回避策として、erson_Person_クラスで_isNotAdult()_メソッドを作成し、このメソッドへの参照を使用します。
people.stream()
.filter(Person::isNotAdult)
.collect(Collectors.toList());
ただし、このメソッドをAPIに追加したくない場合や、クラスが自分のものではないために追加できない場合があります。 次のセクションで説明するように、Java 11が_Predicate.not()_メソッドとともに到着するのはそのときです。
3. _Predicate.not()_メソッド
*既存の_Predicate_を無効にするために、__Predicate.not()__staticメソッドがJava 11に追加されました。*
前の例を取り上げて、その意味を見てみましょう。 ラムダを使用したり、_Person_クラスで新しいメソッドを作成する代わりに、次の新しいメソッドを使用できます。
people.stream()
.filter(Predicate.not(Person::isAdult))
.collect(Collectors.toList());
そうすれば、APIを変更する必要がなく、メソッド参照の可読性に依存できます。
静的インポートを使用して、これをさらに明確にすることができます。
people.stream()
.filter(not(Person::isAdult))
.collect(Collectors.toList());
4. 結論
この短い記事では、_Predicate.not()_メソッドを活用して、述語が否定されていても、述語のメソッド参照の使用を維持する方法を見てきました。
いつものように、記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-11/src/main/java/com/baeldung/で見つけることができますpredicate / not [GitHubで]。