欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Java8 函数式接口理解及测试

程序员文章站 2024-02-09 21:16:04
1. 函数式接口的理解 根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,java8新引入的函数式接口就是基于这个思想进行设计的。 2. 函数式接口...

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());

  }

以上这篇基于java8 函数式接口理解及测试就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。