函数式接口理解及测试

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/10d3fb968a030a2e7966b4d1cd7bac2c.html