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