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で]。