Класс Predicate
Класс Predicate представляет собой функциональный интерфейс из пакета java.util.function, который принимает один аргумент типа T и возвращает значение типа boolean. Данный интерфейс широко используется в Stream API для фильтрации элементов, а также в методах filter, anyMatch, allMatch, noneMatch, takeWhile и dropWhile. В первом параметре функционального метода test мы передаем значение, которое необходимо проверить, а метод возвращает результат проверки в виде true или false. Интерфейс Predicate также имеет методы по умолчанию and, or и negate для составления составных условий.
Синтаксис
@FunctionalInterface
public interface Predicate<T>
{
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other)
default Predicate<T> negate()
}
Пример
Давайте создадим предикат, который проверяет, является ли число четным, и применим его к нескольким значениям:
import java.util.function.Predicate;
public class Main
{
public static void main(String[] args)
{
Predicate<Integer> isEven = n -> n % 2 == 0;
System.out.println(isEven.test(4));
System.out.println(isEven.test(7));
System.out.println(isEven.test(10));
}
}
Результат выполнения кода:
true
false
true
Пример
Давайте используем предикат вместе с методом filter для отбора четных чисел из списка:
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> isEven = n -> n % 2 == 0;
List<Integer> res = list.stream()
.filter(isEven)
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[2, 4]
Пример
Давайте объединим два условия с помощью метода and - число должно быть больше 1 и меньше 5:
import java.util.function.Predicate;
public class Main
{
public static void main(String[] args)
{
Predicate<Integer> moreThanOne = n -> n > 1;
Predicate<Integer> lessThanFive = n -> n < 5;
Predicate<Integer> combined = moreThanOne.and(lessThanFive);
System.out.println(combined.test(3));
System.out.println(combined.test(7));
System.out.println(combined.test(1));
}
}
Результат выполнения кода:
true
false
false
Пример
Давайте применим метод negate для инвертирования условия:
import java.util.function.Predicate;
public class Main
{
public static void main(String[] args)
{
Predicate<String> isEmpty = s -> s.isEmpty();
Predicate<String> isNotEmpty = isEmpty.negate();
System.out.println(isNotEmpty.test("abcde"));
System.out.println(isNotEmpty.test(""));
}
}
Результат выполнения кода:
true
false