Статьи

Интерфейс предиката и потребителя в пакете java.util.function в Java 8

В моем предыдущем посте я писал об интерфейсе 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 true
or(Predicate<? super T> p)
  
//Returns true if the input object matches some criteria
test(T t)
  
//Returns a predicate that evaluates to true if both or neither
//of the component predicates evaluate to true
xor(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.