一,定义

函数式接口,英文为Functional Interface。首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法。

这里的只允许一个抽象方法不包括以下几种情况:
1,函数式接口里面允许有默认方法。我觉得可能是java设计师考虑到默认方法不是抽象的,它有默认实现的方法体。

2,函数式接口里面允许有静态方法。原因和上面相同,静态方法并不能是抽象方法。

3,函数式接口里面允许有java.lang.Object的public方法。可能是因为接口的实现类都继承了java.lang.Object。

package com.czx;

//该注释是在编译期间检查是否为函数式接口
@FunctionalInterface
public interface JDK8Interface { //抽象方法
public boolean isNull(Object o); //java.lang.Object中public方法
public boolean equals(Object obj);
public int hashCode(); //static方法
public static void staticMethod(){
System.out.println("JDK8Interface的静态方法");
} //default方法
public default void defaultMethod(){
System.out.println("JDK8Interface的默认方法");
}
}

注意:如果你想定义一个函数式接口的话,最好把@FunctionalInterface加上,它会在编译期间检测该接口是否为函数式接口。

二,运用

我们可以通过Lambda表达式实现接口的抽象方法,比之前简直简洁太多。之前的方法是写一个实现该接口的类,并写出实现体。具体的不写了,我们看看通过Lambda表达式的代码有多简洁。

package com.czx;

public class Test2 {

    public static void main(String[] args) {
JDK8Interface it = (a) -> a == null; System.out.println(it.isNull(2));//false
System.out.println(it.isNull("mine"));//false
System.out.println(it.isNull(null));//true
}
}

这就结束了,是不是很简单。

三,JDK8中新增的函数式接口

JDK8中引入了java.util.function,此包中内置许多函数式接口,现在将几个常用的函数式接口做说明。

1,Predicate接口

输入一个参数,并返回一个Boolean值,其中内置许多用于逻辑判断的默认方法:

    @Test
    public void predicateTest() {
        Predicate<Integer> predicate = (s) -> s > 0;
        boolean test = predicate.test(2);
        System.out.println("该数字大于0:" + test);         test = predicate.test(0);
        System.out.println("该数字大于0:" + test);         test = predicate.negate().test(0);
        System.out.println("该数字小于等于0:" + test);
    }

2,Function接口

接收一个参数,返回单一的结果,默认的方法(andThen)可将多个函数串在一起,形成复合Funtion(有输入,有输出)结果:

    @Test
    public  void functionTest() {         Function<Integer, Integer> add = (i) -> {
            System.out.println("初始值:" + i);
            return i+1;
        };
        Function<Integer, Integer> power = add.andThen((i) -> {
            System.out.println("第一次运算:" + i);
            return i * i;
        });         Integer res = power.apply(2);
        System.out.println("第二次运算:" + res);
    }

3,Supplier接口

返回一个给定类型的结果,与Function不同的是,Supplier不需要接受参数(供应者,有输出无输入):

    @Test
    public void supplierTest() {
        Supplier<String> supplier = () -> "有输出,无输入。";
        String s = supplier.get();
        System.out.println(s);
    }

4,Consumer接口

代表了在单一的输入参数上需要进行的操作。和Function不同的是,Consumer没有返回值(消费者,有输入,无输出):

    @Test
    public void consumerTest() {
        Consumer<Integer> add = (p) -> {
            System.out.println("old value:" + p);
            p = p + 1;
            System.out.println("new value:" + p);
        };
        add.accept(1);
    }

以上四个接口的用法代表了java.util.function包中四种类型,理解这四个函数式接口之后,其他的接口也就容易理解了。

最新文章

  1. Python面向对象详解
  2. sdk更新代理设置
  3. 打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
  4. matlab report generator
  5. AI--&gt;从新建文档开始说起,串联相关色彩知识
  6. QT数据库使用案列【联系人】-- 使用sqlite和QStringListModel
  7. bzoj 1068: [SCOI2007]压缩 DP
  8. java反射机制(工厂模式)
  9. 医院设置 codevs 2577
  10. http://bassistance.de/jquery-plugins/
  11. 利用Java内置的API开发JMX功能
  12. No Team Selected:A team must be selected to run &#39;ProjectName&#39; on iPhoneName
  13. SpringBoot Docker Mysql安装,Docker安装Mysql
  14. SQL Server 2008数据库连接错误
  15. ionic 混合应用开发
  16. js 去掉空格.回车.换行
  17. mac上将代码上传到github以及github对100M以上文件限制上传的处理(lfs)。
  18. PyQt5系列教程(三)用py2exe进行程序打包
  19. 使用Composer管理PHP依赖关系
  20. Tuple和 ValueTuple

热门文章

  1. android中复制图片
  2. “发布后tomcat中的classes目录为空”问题
  3. Java_Web之分层架构
  4. Android测试写入文本Log
  5. CodeForces 356A_(set应用,线段树)
  6. redis得配置及使用
  7. 拓扑排序(Topological Order)
  8. Qt5.11+opencv3.4的配置安装
  9. 数据持久层(DAO)通用API的实现
  10. 在centos6上面安装python3.4