В моем предыдущем посте я писал об интерфейсе Function, который является частью java.util.package. Я также упомянул об интерфейсе Predicate, который является частью того же пакета, и в этой статье я покажу вам, как вы можете использовать интерфейсы Predicate и Consumer . Давайте посмотрим на интерфейс Javadoc для предиката :
Определяет, соответствует ли входной объект некоторым критериям.
И есть 5 методов, объявленных / определенных в этом интерфейсе (вам должно быть интересно, каков это функциональный интерфейс , если это так, вы должны прочитать это, прежде чем продолжить), и эти методы:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
//Returns a predicate which evaluates to true only if this predicate//and the provided predicate both evaluate to true.and(Predicate<? super T> p)  //Returns a predicate which negates the result of this predicate.negate()  //Returns a predicate which evaluates to true if either//this predicate or the provided predicate evaluates to trueor(Predicate<? super T> p)  //Returns true if the input object matches some criteriatest(T t)  //Returns a predicate that evaluates to true if both or neither//of the component predicates evaluate to truexor(Predicate<? super T> p) | 
Все методы, кроме test (T t), являются методами по умолчанию, а test (T t) является абстрактным. Один из подходов к обеспечению реализации этого абстрактного метода заключается в использовании внутреннего класса Anonymous, а другой — в использовании лямбда-выражения .
Интерфейс Javadoc для потребителей :
Операция, которая принимает один входной аргумент и не возвращает результата. В отличие от большинства других функциональных интерфейсов, ожидается, что потребитель будет работать через побочные эффекты.
В этом интерфейсе есть 2 метода, из которых только один является абстрактным, и этот абстрактный метод: accept (T t), который принимает входные данные и не возвращает никакого результата. Чтобы объяснить больше об интерфейсе Predicate и Consumer, давайте рассмотрим класс Student с названием, оценкой и платой. У каждого студента есть некоторая скидка, которая определяется на основе оценки студента.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
class Student{  String firstName;  String lastName;  Double grade;  Double feeDiscount = 0.0;  Double baseFee = 20000.0;    public Student(String firstName, String lastName,                 Double grade) {    this.firstName = firstName;    this.lastName = lastName;    this.grade = grade;  }      public void printFee(){    Double newFee = baseFee - ((baseFee*feeDiscount)/100);    System.out.println("The fee after discount: "+newFee);  }} | 
И давайте создадим метод, который принимает объект Student, реализацию Predicate и реализацию Consumer. Если вы не знакомы с интерфейсом Function, вам следует потратить несколько минут на его чтение. Этот метод использует предикат, чтобы решить, нужно ли обновить студенческую скидку на плату, а затем использует реализацию Consumer для обновления скидки.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
 | 
public class PreidcateConsumerDemo {      public static Student updateStudentFee(Student student,          Predicate<Student> predicate,          Consumer<Student> consumer){          //Use the predicate to decide when to update the discount.    if ( predicate.test(student)){      //Use the consumer to update the discount value.      consumer.accept(student);    }    return student;  }  } | 
И метод test, и метод accept в Predicate и Consumer соответственно принимают параметр объявленного универсального типа. Разница между ними заключается в том, что предикат использует параметр, чтобы принять какое-то решение и вернуть логическое значение, тогда как Consumer использует параметр, чтобы изменить некоторые из его значений. Давайте посмотрим, как вызывается метод updateStudentFee:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
public static void main(String[] args) {    Student student1 = new Student("Ashok","Kumar", 9.5);  student1 = updateStudentFee(student1,                      //Lambda expression for Predicate interface                      student -> student.grade > 8.5,                      //Lambda expression for Consumer inerface                      student -> student.feeDiscount = 30.0);  student1.printFee();      Student student2 = new Student("Rajat","Verma", 8.0);  student2 = updateStudentFee(student2,                      student -> student.grade >= 8,                      student -> student.feeDiscount = 20.0);  student2.printFee();    } | 
В этом посте я объяснил на примере, как мы можем использовать интерфейсы Predicate и Consumer, которые являются частью пакета java.util.function, который будет представлен в Java 8.