函数式接口的特点

  • 接口有且仅有一个抽象方法
  • 允许定义静态方法和默认方法(这两个都不是抽象方法)
  • 允许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. java中的generate

    流generate(Supplier s)返回无限顺序无序流,其中每个元素由提供的供应商生成.这适用于生成恒定流,随机元素流等. public class Flow { public static v ...

  2. SpirngMVC源码分析

    分析过程 通过 前端控制器源码 分析 SpringMVC 的执行过程 前端控制器在 web.xml 文件中的配置 <!-- springmvc 前端控制器 --> <servlet& ...

  3. Flask-Migrate使用教程

    功能:flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 项目准备:一个干净的Flask项目,下载连接地址: https://pan.baidu.com/s/1WqdIN ...

  4. 学习GlusterFS(八)

    GlusterFS集群创建 一.简介 GlusterFS概述 Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中Glusterfs能够 ...

  5. Web存储之LocalStorage初探

    Web存储之LocalStorage初探 HTML5的发布和定稿为前端界带来巨大的变化,新增的API和特性给业务带来了更多可能性,让用户体验拥有了更可能的丰富. · HTML Geolocation ...

  6. 手把手教你从零写一个简单的 VUE--模板篇

    教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...

  7. 洛谷 P5706 【深基2.例8】再分肥宅水

    题目连接: P5706 [深基2.例8]再分肥宅水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 我提交的: 1 #include<iostream> 2 #inclu ...

  8. 记一次曲折的CVE-2018-1270复现分析

    前言 前两天接到朋友对某个授权目标的漏扫结果,也算是初次接触到这个漏洞,就想着顺手分析一下复现一下,因为分析这个漏洞的文章也比较少,所以刚开始比较迷,进度也比较慢. 漏洞复现 使用vulhub搭建环境 ...

  9. JS 实现权限列表移动

    JS 实现列表移动 学习内容: 需求 总结: 学习内容: 需求 用 JS 实现列表移动 实现代码 <html> <head> <meta http-equiv=" ...

  10. Azure Virtual Desktop(一)创建配置管理

    一,引言 Azure 虚拟创面是一项 Azure 服务,可以让我们管理: 1)VDI(虚拟桌面基础架构) 2)云端的 RDSH:RDSH 是 RDS(远程桌面服务)中的一个角色.这些类型的服务器用于托 ...