Метод negate
Метод negate класса Predicate возвращает новый предикат,
который является логическим отрицанием исходного предиката.
Иными словами, если исходный предикат возвращал true,
то новый предикат вернет false, и наоборот.
Метод не принимает параметров и не изменяет исходный предикат -
он создает и возвращает новый объект Predicate.
Метод negate особенно удобен при работе со Stream API,
когда нужно инвертировать условие фильтрации, не переписывая
логику самого предиката.
Синтаксис
Predicate<T> negate()
Метод возвращает новый предикат типа Predicate<T>,
представляющий логическое отрицание исходного предиката.
Пример
Давайте создадим предикат, проверяющий, что число четное, и получим его отрицание:
import java.util.function.Predicate;
public class Main
{
public static void main(String[] args)
{
Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> isOdd = isEven.negate();
System.out.println(isEven.test(4));
System.out.println(isOdd.test(4));
System.out.println(isOdd.test(5));
}
}
Результат выполнения кода:
true
false
true
Пример
Давайте используем negate вместе со Stream API,
чтобы отфильтровать строки, которые не начинаются с буквы
"a":
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("abcde", "bcdef", "acdef", "12345");
Predicate<String> startsWithA = s -> s.startsWith("a");
Predicate<String> notStartsWithA = startsWithA.negate();
List<String> res = list.stream()
.filter(notStartsWithA)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[bcdef, 12345]
Пример
Давайте применим negate к предикату, проверяющему,
что число больше 3, и отфильтруем коллекцию:
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Predicate<Integer> greaterThanThree = n -> n > 3;
Predicate<Integer> notGreaterThanThree = greaterThanThree.negate();
List<Integer> res = list.stream()
.filter(notGreaterThanThree)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3]