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

 更新时间:2017年08月09日 09:13:31   投稿:jingxian  
下面小编就为大家带来一篇基于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());

  }

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

相关文章

  • springboot+jwt实现token登陆权限认证的实现

    springboot+jwt实现token登陆权限认证的实现

    这篇文章主要介绍了springboot+jwt实现token登陆权限认证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 学习在一台新电脑上配置JAVA开发环境

    学习在一台新电脑上配置JAVA开发环境

    本文主要介绍了如何在一台新电脑上配置JAVA开发环境,每一个步骤都有对应的截图和文字说明,需要的朋友可以参考下
    2015-07-07
  • Spring Boot @Async 异步任务执行方法

    Spring Boot @Async 异步任务执行方法

    本篇文章主要介绍了Spring Boot @Async 异步任务执行方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java实现商品的查找、添加、出库、入库操作完整案例

    Java实现商品的查找、添加、出库、入库操作完整案例

    这篇文章主要介绍了Java实现商品的查找、添加、出库、入库操作,结合完整实例形式分析了java基于面向对象的商品信息添加、删除、查找等相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • SpringBoot通过@Scheduled实现定时任务及单线程运行问题解决

    SpringBoot通过@Scheduled实现定时任务及单线程运行问题解决

    Scheduled定时任务是Spring boot自身提供的功能,所以不需要引入Maven依赖包,下面这篇文章主要给大家介绍了关于SpringBoot通过@Scheduled实现定时任务以及问题解决的相关资料,需要的朋友可以参考下
    2023-02-02
  • JAVA8发送带有Body的HTTP GET请求

    JAVA8发送带有Body的HTTP GET请求

    本文主要介绍了JAVA8发送带有Body的HTTP GET请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • SpringMVC mybatis整合实例代码详解

    SpringMVC mybatis整合实例代码详解

    这篇文章主要介绍了springmvc与mybatis实例详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-04-04
  • mybatis中映射文件include标签的应用

    mybatis中映射文件include标签的应用

    这篇文章主要介绍了mybatis中映射文件include标签的应用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java ArrayList与LinkedList使用方法详解

    Java ArrayList与LinkedList使用方法详解

    Java中容器对象主要用来存储其他对象,根据实现原理不同,主要有3类常用的容器对象:ArrayList使用数组结构存储容器中的元素、LinkedList使用链表结构存储容器中的元素
    2022-11-11
  • Java实现优先队列式广度优先搜索算法的示例代码

    Java实现优先队列式广度优先搜索算法的示例代码

    这篇文章主要为大家详细介绍了Java如何实现优先队列式广度优先搜索算法,文中通过一个示例带大家具体了解了实现的方法,需要的可以参考一下
    2022-08-08

最新评论