Consumer可以作为回调函数使用,很是方便,在接下来的学习中会使用到,我们先了解一下Consumer是什么。
基本概念
Predicate和Consumer在Java8提供,更多的是一个概念,场景是如果怎么怎么样(predicate),那么怎么怎么做(consumer)。具体的可以去阅读javadoc。我们通过一个小例子来学。
这是个计算学费的小例子,如果学生成绩达到某个水平,就可以享有某种折扣。(类似补习班的费用,公知和媒体以及一堆猪头在大力叫嚷,千方百计地降低公共教育的质量,然后一堆补习班,托管班,背后都是巨大的利益)
小例子
小例子为提供根据学生的成绩计算费用。
public class PCTest {
// 【1】学费类: Student -》 提供简单的根据成绩计算费用的类。
public static class Student{
String name;
Double grade;
Double feeDiscount = 0.0;
Double baseFee = 20000.0;
public Student(String name, Double grade) {
this.name = name;
this.grade = grade;
}
public void printFee(){
Double fee = baseFee - ((baseFee * feeDiscount) / 100);
System.out.println(name + "'s fee after discount(" + feeDiscount + "): " + fee);
}
}
//【2】Predicate和Consumer的使用:student如果在某个条件predicate.test()成立,就执行consumer.accept()
public static void updateStudentFee(Student student, Predicate<Student> predicate, Consumer<Student> consumer){
if(predicate.test(student))
consumer.accept(student);
}
//(方式1)实现Predicate和Consumer,这两个接口也比较简单
//(方式1.1)实现Predicate接口,具体需要实现条件判断test()方法
public static class MyPredicate implements Predicate<Student>{
@Override
public boolean test(Student t) {
return t.grade >= 8.0;
}
}
//(方式1.2)实现Consumer接口,具体需要实现接纳的处理accept()方法
public static class MyConsumer implements Consumer<Student>{
@Override
public void accept(Student t) {
t.feeDiscount = 50.0;
}
}
//(方式3)方法实现费率设置的处理
public void mySetDiscount(Student student){
student.feeDiscount = 10.0;
}
public static void main(String[] args) {
//【测试1】传统的书写方式
Predicate<Student> p = new MyPredicate();
Consumer<Student> c = new MyConsumer();
Student student1 = new Student("Rajat", 8.5);
updateStudentFee(student1, p, c);
student1.printFee();
//【测试2】lambada表达方式
Student student2 = new Student("Ashok", 9.5);
updateStudentFee(student2, student -> student.grade >8.5, student -> student.feeDiscount = 30.0);
student2.printFee();
//【测试3】Method References方式,具体可参见 Filter(2):处理异步请求#再看一个小例子 中的说明
Student student3 = new Student("Test", 9.0);
PCTest test = new PCTest();
updateStudentFee(student3, p, test::mySetDiscount);
student3.printFee();
}
}
这更多的是概念的封装,只要明确如果怎样就怎么处理。