參考https://blog.csdn.net/z345434645/article/details/53794724
https://blog.csdn.net/chuji2012/article/details/77871011
1、先來看一個簡單的Consumer<T>的例子
描述:Consumer< T>接口接受一個T類型參數,沒有返回值。
源碼如下:
public interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */
void accept(T t); }
測試代碼如下:
@Test public void test(){ UserT userT = new UserT("zm"); //接受一個參數
Consumer<UserT> userTConsumer = userT1 -> userT1.setName("zmChange");}; userTConsumer.accept(userT); logger.info(userT.getName());//輸出zmChange
}
java8以前的實現如下:
@Test public void test1(){ UserT userT = new UserT("zm"); this.change(userT); logger.info(userT.getName());//輸出zmChange
} private void change(UserT userT){ userT.setName("zmChange"); }
2、Predicate和Consumer綜合應用
為了詳細說明Predicate和Consumer接口,通過一個學生例子:Student類包含姓名、分數以及待付費用,每個學生可根據分數獲得不同程度的費用折扣。
Student類源代碼:
public class Student { String firstName; String lastName; Double grade; Double feeDiscount = 0.0; Double baseFee = 2000.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接口的實現類。本例子使用Predicate接口實現類的test()方法判斷輸入的Student對象是否擁有費用打折的資格,然后使用Consumer接口的實現類更新輸入的Student對象的折扣。
public class PredicateConsumerDemo { public static Student updateStudentFee(Student student, Predicate<Student> predicate, Consumer<Student> consumer){ if (predicate.test(student)){ consumer.accept(student); } return student; } }
Predicate和Consumer接口的test()和accept()方法都接受一個泛型參數。不同的是test()方法進行某些邏輯判斷並返回一個boolean值,而accept()接受並改變某個對象的內部值。updateStudentFee方法的調用如下所示:
public class Test { 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(); //The fee after discount: 1400.0
Student student2 = new Student("Rajat","Verma", 8.0); student2 = updateStudentFee(student2, //Lambda expression for Predicate interface
student -> student.grade >= 8, //Lambda expression for Consumer inerface
student -> student.feeDiscount = 20.0); student2.printFee();//The fee after discount: 1600.0
} }