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-函数式接口理解及测试的更多相关文章

  1. java代码之美(14)---Java8 函数式接口

    Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...

  2. java代码(14) --Java8函数式接口

    Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...

  3. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  4. java8 函数式接口——Function/Predict/Supplier/Consumer

    Function 我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上 ...

  5. java8函数式接口详解、函数接口详解、lambda表达式匿名函数、方法引用使用含义、函数式接口实例、如何定义函数式接口

    函数式接口详细定义 函数式接口只有一个抽象方法 由于default方法有一个实现,所以他们不是抽象的. 如果一个接口定义了一个抽象方法,而他恰好覆盖了Object的public方法,仍旧不算做接口的抽 ...

  6. Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结

    首先看看什么是Lambda 表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递):最简单的Lambda表达式可由逗号分隔的参数列表.-> ...

  7. Java8 函数式接口-Functional Interface

    目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...

  8. Java8函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等

    一:函数式接口 1.函数式接口的概念就是此接口必须有且只能有一个抽象方法,可以通过@FunctionalInterface来显示规定(类似@Override),但是没有此注解的但是只有一个抽象方法的接 ...

  9. Java8函数式接口和Lambda表达式

    两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...

随机推荐

  1. SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数

    这几天写新项目遇到这个问题,看这位博主总结得不错,懒得写了,直接转!原文:http://blog.csdn.net/yixiaoping/article/details/45281721原文有些小错误 ...

  2. C# 获取指定路径下的文件结构(树形结构)

    namespace Vue.Content { public class FileNames { public int id { get; set; } public string text { ge ...

  3. Android几种视频播放方式,VideoView、SurfaceView+MediaPlayer、TextureView+MediaPlayer,以及主流视频播放器开源项目

    简单的说下一Android的几种视频播放功能: 1.VideoView:最简单的视频播放 <FrameLayout xmlns:android="http://schemas.andr ...

  4. css常见布局问题

    1.如何实现一个盒子在页面中上下左右居中 方法一:(盒子宽高固定时) .box{ width:400px; height:200px; background:#000; position:absolu ...

  5. python-pytest学习

    一:pytest基于unittest之上的单元测试框架1.自动发现测试模块和测试方法:2.断言使用assert+表达式即可:3.可以设置会话级.模块级.类级.函数级的fixtures :数据准备+清理 ...

  6. LeetCode100.相同的树

    给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1 ...

  7. Oracle的SQL优化思路

    个人总结SQL脚本优化,大体如下: (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表dir ...

  8. Maven 错误 :The POM for com.xxx:jar:0.0.1-SNAPSHOT is invalid, transitive dependencies (if any) will not be available

    一个大的maven 项目,结构是一个根pom,下面几个小的module,包括了appservice-darc,appservice-entity等,其中appservice-darc 依赖了 apps ...

  9. 接口性能测试(Jmeter)操作总结

    以前常用SoapUI来做接口的性能测试,这次用的Jmeter,对需由客户端根据时间戳等登录参数生成随机token值和印签值来发请求的系统,非它莫属了.下面就这次测试的难点和操作注意问题展开总结. ** ...

  10. 盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k

    最近浏览 Github ,收藏了一些还算不错的 Java面试/学习相关的仓库,分享给大家,希望对你有帮助.我暂且按照目前的 Star 数量来排序. 本文由 SnailClimb 整理,如需转载请联系作 ...