В моем предыдущем посте я писал об интерфейсе 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.