Рубрики
Без рубрики

Свяйте ссылку на метод predicate с Java 11

Узнайте, как свести на нет ссылку на метод предиката с Java 11.

Автор оригинала: François Dupire.

1. Обзор

В этом коротком учебнике мы увидим, как свести на нет Предикат ссылка на метод с помощью Java 11.

Мы начнем с ограничений, с которыми мы столкнулись, чтобы достичь этого до Java 11. Тогда посмотрим, как Predicate.not () метод помогает, а также.

2. Перед Java 11

Во-первых, давайте посмотрим, как нам удалось свести на нет Предикат до Java 11.

Начнем с того, давайте создадим Лицо класс с возрастные поле и isAdult () метод:

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 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());

К сожалению, мы вынуждены отпустить ссылку на метод, даже если нам легче читать. Возможным решением является создание isNotAdult () метод на Лицо класса, а затем использовать ссылку на этот метод:

people.stream()                 
  .filter(Person::isNotAdult)   
  .collect(Collectors.toList());

Но, возможно, мы не хотим добавлять этот метод в наш API, или, может быть, мы просто не можем, потому что класс не наш. Вот когда Java 11 прибывает с Predicate.not () метод, как мы увидим в следующем разделе.

3. Метод Predicate.not()

тем Предикат.не () статический метод был добавлен в Java 11, чтобы свести на нет существующий предикат .

Давайте возьмем наш предыдущий пример и посмотрим, что это значит. Вместо того, чтобы использовать лямбду или создавать новый метод на Лицо класса, мы можем просто использовать этот новый метод:

people.stream()                          
  .filter(Predicate.not(Person::isAdult))
  .collect(Collectors.toList());

Таким образом, мы не должны изменять наш API и по-прежнему можем полагаться на читаемость ссылок на методы.

Мы можем сделать это еще яснее со статичным импортом:

people.stream()                  
  .filter(not(Person::isAdult))  
  .collect(Collectors.toList());

4. Заключение

В этой короткой статье мы видели, как использовать Предикат .not() метод для поддержания использования ссылки метода для предикатов, даже если они отрицаются.

Как обычно, полный код статьи можно найти более на GitHub .