函数式接口和@FunctionalInterface
函数式接口的特点
- 接口有且仅有一个抽象方法
- 允许定义静态方法和默认方法(这两个都不是抽象方法)
- 允许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的更多相关文章
- Java 8中一些常用的全新的函数式接口
这一篇属于菜鸟级博客,只是介绍了一些在Java 8中新出现的一些很有用的接口,通过一些简单的例子加以说明,没有深入地阐述. 函数式接口 什么是函数式接口? 函数式接口,@FunctionalInter ...
- Java 8 特性 —— 函数式接口
函数式接口 概述:接口中只有一个抽象方法. 函数式接口,即适用于函数式编程场景的接口.而 Java 中的函数式编程体现就是 Lambda,所以函数式接口就是可以适用于 Lambda 使用的接口.只有确 ...
- Java之函数式接口
函数式接口 概述:接口中只有一个抽象方法 下面介绍的可能很抽象,理解不了,至少在我看来单独的这几个借口是没有用的,跟最下面说的 Stream流一起用才会有效果 函数式接口,即适用于函数式编程场景的接口 ...
- Java8 函数式接口-Functional Interface
目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...
- Java8函数式接口和Lambda表达式
两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...
- JavaSE复习(六)函数式接口
函数式接口 有且仅有一个抽象方法的接口 @FunctionalInterface注解 一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错.需要注 意的是,即使 ...
- java8中使用函数式接口
使用函数式接口 Predicate @FunctionalInterface interface Predicate<T>{ boolean test(T t); } public sta ...
- java8学习之深入函数式接口与方法引用
函数式接口: 函数式接口[FunctionalInterface]是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想彻底掌握,前提是要彻底理解好函数式接口,所以这次继续 ...
- java8新特性学习:函数式接口
本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...
随机推荐
- Formatter和IStandardConversionService的使用方式
Thymeleaf 1.Formatter接口是当进行请求参数的封装时,会根据Formatter的泛型进行调用Parse方法进行格式化类型 2.IStandardConversionService是T ...
- dp求最长递增子序列并输出
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 5 /** 6 * Create ...
- java接口返回为空时候如何处理
java前后端分离以后,后端常常返回给前端以下的内容: 如果遇到某个字段的内容为空的时候会出现这样的情况: 图中红色箭头的情况是一个数组集合,但是该集合为空,所以就返回null,但是我们如果想对于这样 ...
- C++分布式系统——《开题》
在下自大二接触编程,大二.大三刻苦涉猎编程相关书籍,自那时起爱上了 C++,C++确实极有魅力,本想从此在C++领域深钻,但是扩展技术的广度在那个算是半只脚踏入编程且已经读完了 C++ 流行书籍的阶段 ...
- javascript新手实例1-DOM基本操作
学习javascript好多同学不知道怎么上手,跟着网上的新手教程做了一遍又觉得javascript很简单,但是真正自己用起来又觉得写不出什么东西,我觉得学习最好的方法就是跟着有趣的例子做,所以我们的 ...
- 前端基础之CSS(1)
1.css3的新特性有哪些 (1)CSS3选择器(基本.属性.伪类具体见下) (2)CSS3边框与圆角 圆角border-radius 属性:border-top-left-radius 左上角 bo ...
- 我的python学习记_01
一切的开始都是从打招呼开始的,python也不例外,首先和将要陪伴我后半生的朋友说句情话: print("不是在最美好的时光遇见你,而是因为遇见你才让我有了最美好的时光") 初写代 ...
- vue和react给我的感受
以下纯属个人使用两个框架的感想和体会: 不知道你们是否有这种感觉~ 我vue和react都用过一段时间,但是vue给我感觉就是经常会忘记语法,需要对照文档才知道怎么写( 难不成是我没喝六个核桃的原因吗 ...
- git的下载安装以及基本操作
版权声明:本文为CSDN博主「~李疆」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.转载原文链接:https://blog.csdn.net/qq_403232 ...
- vue 相关问题整理