Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465341
  • 博文数量: 63
  • 博客积分: 1485
  • 博客等级: 上尉
  • 技术积分: 596
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-21 14:49
文章分类

全部博文(63)

文章存档

2018年(8)

2017年(25)

2016年(10)

2012年(6)

2010年(14)

我的朋友

分类: Java

2017-09-04 09:40:21

关于java 8的函数式接口,好多文章可以用来学习,而且都总结的非常好。
比如这一篇,其实这一个系列对于初学者都是很有益的。
    - 函数式接口(Functional Interface)就是一个具有一个方法的普通接口。
    - 函数式接口可以被隐式转换为lambda表达式。
    - 函数式接口可以现有的函数友好地支持 lambda。

我的理解呢,这主要还是方便程序的实现,同时也方便维护。

这里有个例子,其实也是修改的例子:

点击(此处)折叠或打开

  1. import java.util.function.Predicate;
  2. import java.util.function.Consumer;

  3. class Student{
  4.     String firstName;
  5.     String lastName;
  6.     Double grade;
  7.     Double feeDiscount = 0.0;
  8.     Double baseFee = 20000.0;
  9.     public Student(String firstName, String lastName, Double grade) {
  10.         this.firstName = firstName;
  11.         this.lastName = lastName;
  12.         this.grade = grade;
  13.     }
  14.     public void printFee(){
  15.         Double newFee = baseFee - ((baseFee * feeDiscount) / 100);
  16.         System.out.println("The fee after discount: " + newFee);
  17.     }
  18. }

  19. class MyPredicate implements Predicate<Student>{
  20.     public boolean test(Student s){
  21.         return (s.grade > 6.0)? true : false;
  22.     }
  23. }

  24. class MyConsumer implements Consumer <Student> {
  25.     public void accept(Student s){
  26.         s.feeDiscount = 20.0;
  27.     }
  28. }

  29. public class TestConsume {
  30.     public static Student updateStudentFee(Student student, Predicate<Student> predicate, Consumer<Student> consumer){
  31.      if ( predicate.test(student)){
  32.      consumer.accept(student);
  33.      }
  34.      return student;
  35.     }
  36.     public static void main(String[] args) {
  37.         /* way 1 */
  38.      Student student1 = new Student("Ashok","Kumar", 9.5);
  39.      student1 = updateStudentFee(student1,
  40.                                  student -> student.grade > 8.5,
  41.                                  student -> student.feeDiscount = 30.0);
  42.      student1.printFee();
  43.      Student student2 = new Student("Rajat","Verma", 8.0);
  44.      student2 = updateStudentFee(student2,
  45.                                  student -> student.grade >= 8,
  46.                                  student -> student.feeDiscount = 20.0);
  47.      student2.printFee();
  48.     
  49.      /* way 2 */
  50.      Student student3 = new Student("Tom","TT", 6.0);
  51.      MyPredicate myPredicate3 = new MyPredicate();
  52.      MyConsumer myConsumer3 = new MyConsumer();
  53.      student3=updateStudentFee(student3, myPredicate3, myConsumer3);
  54.      student3.printFee();
  55.     
  56.      /* way 3 */
  57.      Student student4 = new Student("Tom","TT", 6.0);
  58.      student4=updateStudentFee(student4,
  59.               new Predicate<Student>() {
  60.           public boolean test(Student s){
  61.                return (s.grade > 5.0)? true : false;
  62.           }
  63.      },
  64.               new Consumer<Student>(){
  65.           public void accept(Student s){
  66.                  s.feeDiscount = 10.0;
  67.              }
  68.      }
  69.      );
  70.      student4.printFee();
  71.     }
  72. }
对于第一种方法:
    - 可以看到通过Lambda表达式,可以很方便的配合函数式接口进行编程。而且逻辑很清晰,方便维护。

对于第二种方法:
    - 这应该是非常传统的写法。
    - 如果要达到第一种的结果(比如:两种评判标准),要写多个类。很繁琐。

对于第三种方法:
   - 算是一种过渡的方法吧。对于不使用Lambda表达式的人来说,比较容易接受。
   



阅读(2736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~