zoukankan      html  css  js  c++  java
  • Java8-函数式接口理解及测试

    1.  函数式接口的理解

      根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行设计的。

    2. 函数式接口定义 

      2.1 自定义如下

        需要FunctionalInterface关键字显示声明:

           @FunctionalInterface
        public interface AppleInterface {
          public void test();
        }

          2.2  系统预定义

         java.util.function.Consumer;
       java.util.function.Function;
       java.util.function.Predicate;
       java.util.function.Supplier;    

         可以去查看源码了解具体的细节,这几个接口包括了常用的一些场景,一般可满足需要

    3. 函数式接口的使用

      函数式接口一般使用前需要先定义,也可以使用系统预定义的几个函数式接口

      函数式接口的使用和使用一个变量没有区别,显示声明定义,格式如下:

      FunctionInterface interface=null;

      这里的interface虽然看起来是一个变量,可是实际却是一段行为代码,用于执行具体的业务逻辑,可以自由在方法接口间传递,也可以直接执行

      interface.doSomeThing();

      如定义函数式接口为参数的接口:

      public void filter(FunctionInterface interface)
      {
        interface.doSomeThing();   }

    4. 函数式接口练习

        4.1 自定义实体类Apple

    public class Apple {
        private String color;
        private float weight;
    
        public Apple(String color, float weight) {
            this.color = color;
            this.weight = weight;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public float getWeight() {
            return weight;
        }
    
        public void setWeight(float weight) {
            this.weight = weight;
        }
    }

      4.2 自定义函数式接口

      该接口有一个test方法,不接收任何参数,也没有任何返回

    @FunctionalInterface
    public interface AppleInterface {
        public void test();
    }

      4.3  测试自定义函数式接口

       @Test
        public void DefineFunctionInterface(){
            //自定义函数式接口
            AppleInterface at=()->System.out.println("define FunctionInterface AppleInterface.");
            at.test();
        }

      至此,就完成一个很简单的函数式接口的定义和调用

      4.4  系统预定义函数式接口

      Consumer<T>:该接口接收一个对象T,返回void,测试如下

       @Test
        public void ConsumerTest(){
            Consumer<Apple> consumer=(Apple app)->{System.out.println(app.getColor()+","+app.getWeight());};
            List<Apple> apps=Arrays.asList(new Apple("red", 120),new Apple("blue", 80),
                    new Apple("green",100));
            ConsumerApple(apps,consumer);
        }
    
        public void ConsumerApple(List<Apple> apps,Consumer<Apple> c){
            for(Apple app:apps){
                c.accept(app);
            }
        }

      Supplier<T>:该接口不接收任何参数,返回一个对象T,测试如下:

       @Test
        public void SupplierTest(){
            Supplier<Apple> supplier=()->{return new Apple("hello supplier",999);};
            Apple app=supplier.get();
            System.out.println(app.getColor()+","+app.getWeight());
        }

      Predicate<T>:该接口接收一个对象T,返回一个Boolean

       @Test
        public void PredicateTest(){
            //系统预定义函数式接口测试
            Predicate<Apple> p1=(Apple a)->{if(a.getWeight()>90) return true;return false;};
            Predicate<Apple> p2=(Apple a)->{if(a.getColor().equals("blue")) return true;return false;};
    
            List<Apple> apps=Arrays.asList(new Apple("red", 120),new Apple("blue", 80),
                    new Apple("green",100));
    
            filterApple(apps,p1);//筛选重量大于90g的苹果
            filterApple(apps,p2);//筛选蓝色的苹果
        }
    
        public void filterApple(List<Apple> apps,Predicate<Apple> p){
            for(Apple app:apps){
                if(p.test(app)){
                    System.out.println(app.getColor()+","+app.getWeight());
                }
            }
    
        } 

      Function<T,R>:  该接口接收一个对象T,经过转换判断,返回一个对象R

       @Test
        public void FunctionTest(){
            Function<String,Apple> function=(String s)->{return new Apple(s,666);};
            Apple app=function.apply("red");
            System.out.println(app.getColor()+","+app.getWeight());
            app=function.apply("green");
            System.out.println(app.getColor()+","+app.getWeight());
    
        }
  • 相关阅读:
    提升工作效率的方法
    Spark Streaming 实现思路与模块概述
    Reduce Side Join实现
    File file:/data1/hadoop/yarn/local/usercache/hp/appcache/application_* does not exi
    Caused by: java.io.IOException: Filesystem closed的处理
    linux下nproc的作用
    Spark Streaming 的一些问题
    php代码审计7审计csrf漏洞
    php代码审计6审计xss漏洞
    php代码审计5审计命令执行漏洞
  • 原文地址:https://www.cnblogs.com/jyris/p/7307670.html
Copyright © 2011-2022 走看看