zoukankan      html  css  js  c++  java
  • java函数式编程之Consumer

    参考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
    
        }
    }
  • 相关阅读:
    Windows 10 IoT Serials 3
    Guest Speaker on 2015 WinHEC Shenzhen 秋季大会
    Ignite China 2015 之行
    Windows 10 IoT Serials 2
    Build 2015 Beijing & Windows 10 China Geek Challenge
    Windows 10 IoT Serials 1
    WinHEC 2015 深圳之行
    Windows on Device 项目实践 5
    2015 MVP OpenDay 及 Community Camp 演讲PPT分享
    Windows on Device 项目实践 4
  • 原文地址:https://www.cnblogs.com/lijingran/p/8708037.html
Copyright © 2011-2022 走看看