Я просматриваю код, который использует Predicate в Java. Я никогда не использовал Predicate. Может ли кто-нибудь привести меня к любому учебнику или концептуальному объяснению Predicate и его реализации в Java?
Предикат в Java
Ответ 1
Я предполагаю, что вы говорите com.google.common.base.Predicate<T> от Guava.
Из API:
Определяет значение
trueилиfalseдля заданного ввода. Например,RegexPredicateможет реализоватьPredicate<String>и вернуть значение true для любой строки, которая соответствует заданному регулярному выражению.
Это, по сути, абстракция ООП для теста boolean.
Например, у вас может быть вспомогательный метод, подобный этому:
static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}
Теперь, учитывая a List<Integer>, вы можете обрабатывать только четные числа, подобные этому:
    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    for (int number : numbers) {
        if (isEven(number)) {
            process(number);
        }
    }
С Predicate тест if абстрагируется как тип. Это позволяет взаимодействовать с остальной частью API, например Iterables, которые имеют множество методов утилиты, которые принимают Predicate.
Таким образом, теперь вы можете написать что-то вроде этого:
    Predicate<Integer> isEven = new Predicate<Integer>() {
        @Override public boolean apply(Integer number) {
            return (number % 2) == 0;
        }               
    };
    Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);
    for (int number : evenNumbers) {
        process(number);
    }
Обратите внимание, что теперь цикл for-each намного проще без теста if. Мы достигли более высокого уровня абстракции, определяя Iterable<Integer> evenNumbers, используя filter -ing, используя Predicate.
Ссылки API
-  Iterables.filter- Возвращает элементы, которые удовлетворяют предикату.
 
О функции более высокого порядка
 Predicate позволяет Iterables.filter служить тем, что называется функцией более высокого порядка. Само по себе это дает много преимуществ. Возьмите пример List<Integer> numbers выше. Предположим, мы хотим проверить, являются ли все числа положительными. Мы можем написать что-то вроде этого:
static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}
//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}
С Predicate и взаимодействуя с остальными библиотеками, мы можем вместо этого написать следующее:
Predicate<Integer> isPositive = new Predicate<Integer>() {
    @Override public boolean apply(Integer number) {
        return number > 0;
    }       
};
//...
if (Iterables.all(numbers, isPositive)) {
    System.out.println("Yep!");
}
Надеюсь, теперь вы можете увидеть значение в более высоких абстракциях для таких подпрограмм, как "фильтровать все элементы по данному предикату", "проверить, удовлетворяют ли все элементы заданным предикатом" и т.д. сделать лучший код.
К сожалению, у Java нет первоклассных методов: вы не можете передавать методы до Iterables.filter и Iterables.all. Разумеется, вы можете проходить объекты на Java. Таким образом, тип Predicate определен, и вместо этого вы передаете объекты, реализующие этот интерфейс.
См. также
Ответ 2
Предикат - это функция, которая возвращает истинное/ложное (то есть логическое) значение, в отличие от предложения, которое является истинным/ложным (то есть логическим) значением. В Java нельзя иметь автономные функции, поэтому создается предикат, создавая интерфейс для объекта, который представляет предикат, а затем предоставляет класс, реализующий этот интерфейс. Примером интерфейса для предиката может быть:
public interface Predicate<ARGTYPE>
{
    public boolean evaluate(ARGTYPE arg);
}
И тогда у вас может быть такая реализация, как:
public class Tautology<E> implements Predicate<E>
{
     public boolean evaluate(E arg){
         return true;
     }
}
Чтобы получить лучшее концептуальное понимание, вы можете прочитать о логике первого порядка.
  Изменить 
Существует стандартный Predicate интерфейс (java.util.function.Predicate), определенный в Java API, как на Java 8. До Java 8 вам может быть удобно повторно использовать com.google. common.base.Predicate от Guava.
Также обратите внимание, что с Java 8 гораздо проще писать предикаты с помощью lambdas. Например, в Java 8 и выше можно передать p -> true функции вместо определения подкласса под названием Tautology, как указано выше.
Ответ 3
Вы можете просмотреть примеры java doc или пример использования Predicate здесь
В основном он используется для фильтрации строк в наборе результатов на основе любых конкретных критериев, которые могут иметься, и возвращает true для тех строк, которые соответствуют вашим критериям:
 // the age column to be between 7 and 10
    AgeFilter filter = new AgeFilter(7, 10, 3);
    // set the filter.
    resultset.beforeFirst();
    resultset.setFilter(filter);
Ответ 4
Добавление к тому, что Micheal сказал:
Вы можете использовать Predicate следующим образом для фильтрации коллекций в java:
public static <T> Collection<T> filter(final Collection<T> target,
   final Predicate<T> predicate) {
  final Collection<T> result = new ArrayList<T>();
  for (final T element : target) {
   if (predicate.apply(element)) {
    result.add(element);
   }
  }
  return result;
}
одним возможным предикатом может быть:
final Predicate<DisplayFieldDto> filterCriteria = 
                    new Predicate<DisplayFieldDto>() {
   public boolean apply(final DisplayFieldDto displayFieldDto) {
    return displayFieldDto.isDisplay();
   }
  };
Использование:
 final List<DisplayFieldDto> filteredList=
 (List<DisplayFieldDto>)filter(displayFieldsList, filterCriteria);
