Negar uma referência de método de predicado com Java 11
1. Visão geral
Neste breve tutorial, veremos como negar uma referência de métodoPredicate usando Java 11.
Começaremos com as limitações encontradas para conseguir isso antes do Java 11. Então, veremos como o métodoPredicate.not() também ajuda.
2. Antes do Java 11
Primeiro, vamos ver como conseguimos negar aPredicate antes do Java 11.
Para começar, vamos criar uma classePerson com um campoage e um métodoisAdult():
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;
}
}
Agora, vamos imaginar que temos uma lista de pessoas:
List people = Arrays.asList(
new Person(1),
new Person(18),
new Person(2)
);
E queremos recuperar todos os adultos. Para conseguir isso no Java 8, podemos:
people.stream()
.filter(Person::isAdult)
.collect(Collectors.toList());
No entanto, e se quisermos recuperar as pessoas não adultas? Então temos que negar o predicado:
people.stream()
.filter(person -> !person.isAdult())
.collect(Collectors.toList());
Unfortunately, we are forced to let go of the method reference, even though we find it easier to read. Uma possível solução alternativa é criar um métodoisNotAdult() na classePerson e, em seguida, usar uma referência a este método:
people.stream()
.filter(Person::isNotAdult)
.collect(Collectors.toList());
Mas talvez não queiramos adicionar este método à nossa API, ou talvez simplesmente não possamos porque a classe não é nossa. É quando o Java 11 chega com o métodoPredicate.not(), como veremos na seção a seguir.
3. O MétodoPredicate.not()
O métodoPredicate.not() static foi adicionado ao Java 11 para negar umPredicate existente.
Vamos pegar nosso exemplo anterior e ver o que isso significa. Em vez de usar um lambda ou criar um novo método na classePerson, podemos apenas usar este novo método:
people.stream()
.filter(Predicate.not(Person::isAdult))
.collect(Collectors.toList());
Dessa forma, não temos que modificar nossa API e ainda podemos contar com a legibilidade das referências de método.
Podemos deixar isso ainda mais claro com uma importação estática:
people.stream()
.filter(not(Person::isAdult))
.collect(Collectors.toList());
4. Conclusão
Neste breve artigo, vimos como aproveitar o métodoPredicate.not() para manter o uso de referências de método para predicados, mesmo se eles forem negados.
Como de costume, o código completo do artigo pode ser encontradoover on GitHub.