函数式接口的特点

  • 接口有且仅有一个抽象方法
  • 允许定义静态方法和默认方法(这两个都不是抽象方法)
  • 允许java.lang.Object中的public方法(因为任何一个函数式接口的实现,默认都继承了Object类)
  • 添加@FunctionInterface注解会让编译器检查是否符合函数式接口的约束规范,但不是必须添加。没有添加时,只要符合以上规范也认为是一个函数式接口。
  • 主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

接口类型

Supplier型:无参数、有返回值

Consumer型:有参数、无返回值

Runnable型:无参数、无返回值

Function型:有参数、有返回值

JDK中的函数式方法举例

  • java.lang.Runnable,
  • java.awt.event.ActionListener,
  • java.util.Comparator,
  • java.util.concurrent.Callable
  • java.util.function包下的接口,如Consumer、Predicate、Supplier等

用法举例

1.用来处理异常

先定义一个函数式接口

@FunctionalInterface
public interface ThrowExceptionHandler { /**
* 抛出异常信息
* @param message
*/
void throwErrorMessage(String message);
}

再定义处理方法

    public static ThrowExceptionHandler assertsTrue(boolean flag) {
return (errorMessage) -> {
if (!flag) {
throw new RuntimeException(errorMessage);
}
};
}

调用上述方法测试

    assertsTrue(false).throwErrorMessage("抛出异常");

2.用来处理分支

先定义一个函数式接口

@FunctionalInterface
public interface BranchHandler { /**
* 分支判断
* @param trueHandler
* @param falseHandler
*/
void trueOrFalseHandler(Runnable trueHandler, Runnable falseHandler);
}

再定义一个处理方法

   public static BranchHandler isTrueOrFalse(boolean flag) {
return (trueHandler, falseHandler) -> {
if (flag) {
trueHandler.run();
} else {
falseHandler.run();
}
};
}

调用上述方法测试

    isTrueOrFalse(true).trueOrFalseHandler(
() -> { System.out.println("true"); },
() -> { System.out.println("false"); }
);

函数式接口和@FunctionalInterface的更多相关文章

  1. Java 8中一些常用的全新的函数式接口

    这一篇属于菜鸟级博客,只是介绍了一些在Java 8中新出现的一些很有用的接口,通过一些简单的例子加以说明,没有深入地阐述. 函数式接口 什么是函数式接口? 函数式接口,@FunctionalInter ...

  2. Java 8 特性 —— 函数式接口

    函数式接口 概述:接口中只有一个抽象方法. 函数式接口,即适用于函数式编程场景的接口.而 Java 中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于 Lambda 使用的接口.只有确 ...

  3. Java之函数式接口

    函数式接口 概述:接口中只有一个抽象方法 下面介绍的可能很抽象,理解不了,至少在我看来单独的这几个借口是没有用的,跟最下面说的 Stream流一起用才会有效果 函数式接口,即适用于函数式编程场景的接口 ...

  4. Java8 函数式接口-Functional Interface

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

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

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

  6. JavaSE复习(六)函数式接口

    函数式接口 有且仅有一个抽象方法的接口 @FunctionalInterface注解 一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错.需要注 意的是,即使 ...

  7. java8中使用函数式接口

    使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...

  8. java8学习之深入函数式接口与方法引用

    函数式接口: 函数式接口[FunctionalInterface]是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想彻底掌握,前提是要彻底理解好函数式接口,所以这次继续 ...

  9. java8新特性学习:函数式接口

    本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...

随机推荐

  1. 使用conda管理python环境和包

    操作系统:CentOS7使用virtualenv管理python虚拟环境virtualenv是一款轻量级第三方虚拟环境管理工具,不像Anaconda大小达上百M,virtualenv大小只有10M左右 ...

  2. centos安装服务参考博客,亲测可用

    centos 安装nginx参考 日志log报错 nginx -c /etc/nginx/nginx.conf https://blog.csdn.net/weixin_41004350/articl ...

  3. GoLang数组切片

    1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...

  4. mybatis 实现分页和过滤模糊查询

    基于 mybatis 的分页和过滤查询 学习内容: 分页设计 1.分页需传递的参数 2.分页需展示的数据 3.分页需展示的数据的来源 3.1.结果总数与结果集(分页原理) 3.2.总页数.上一页和下一 ...

  5. Ubuntu20.04中创建Pycharm桌面快捷方式

    [Desktop Entry] Type=Application Name=Pycharm GenericName=Pycharm3 Comment=Pycharm3:The Python IDE E ...

  6. 小程序容器技术,App热更新与敏捷开发新方案

    作为追求代码洁癖的软件工程师,我们对"紧耦合"的技术实现可以说是深恶痛绝.要解决当前企业移动端App日益沉重.难以真正迭代.投入产出比低的问题,首先在技术架构上要实现真正的&quo ...

  7. mysql HikariCP连接池配置

    #连接池配置 #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size spring.datasource.hikari.minimum ...

  8. DRF JWT认证(一)

    为什么要使用JWT认证?构成和原理又是什么?怎么还有Base64的事?我都写了

  9. 4.Docker容器学习之Dockerfile入门到放弃

    原文地址: 点击直达 0x01 Dockerfile 编写 描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内 ...

  10. 地铁系统ajax人性化操作

    根据选择的城市不同,显示的地铁系统和线路图也不同