云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
函数式接口
如果你的好奇心使你翻看Runnable接口源代码,你会发现该接口被一个@FunctionalInterface的注解修饰,这是 Java 8 中添加的新注解,用于表示 「函数式接口」。
FunctionalInterface-Runnable
函数式接口又是什么鬼?
在 Java 8 中,把那些仅有一个抽象方法的接口称为函数式接口。如果一个接口被@FunctionalInterface注解标注,表示这个接口被设计成函数式接口,只能有一个抽象方法,如果你添加多个抽象方法,编译时会提示“Multiple non-overriding abstract methods found in interface XXX”之类的错误。
标注为 FunctionalInterface 的接口被称为函数式接口,该接口只能有一个自定义方法,但是可以包括从 object 类继承而来的方法。如果一个接口只有一个方法,则编译器会认为这就是一个函数式接口。是否是一个函数式接口,需要注意的有以下几点:
- 该注解只能标记在”有且仅有一个抽象方法”的接口上。
- JDK8 接口中的静态方法和默认方法,都不算是抽象方法。
- 接口默认继承 java.lang.Object,所以如果接口显示声明覆盖了 Object 中方法,那么也不算抽象方法。
- 该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
- 在一个接口中定义两个自定义的方法,就会产生 Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface 错误。
函数式方法又能做什么?
Java8 允许你以 Lambda 表达式的方式为函数式接口提供实现,「通俗的说,你可以将整个 Lambda 表达式作为接口的实现类」。
除了Runnable之外,Java 8 中内置了许多函数式接口供开发者使用,这些接口位于java.util.function包中。如:
Functional-Package
如果输入参数是基本类型,为了避免自动拆箱装箱,可以使用其他基本类型的函数接口。
Function
interface Function 接口包含一个apply方法、两个默认方法(compose、andThen)和一个静态方法identity。apply是接口的基本方法。compose、andThen是一对儿方法,他们的区别在于执行的顺序不同。
Consumer
interface Consumer 接口包含一个void accept(T t);方法、默认方法andThen.
只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。
Predicate
interface Predicate接口包含一个boolean test(T t);方法,三个默认方法(and,negate,or),还有一个静态方法。我们也知道Predicate 接口是返回 boolean 类型的,所以一看就知道是条件判断的。举几个栗子吧:
只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。
Supplier
Supplier只有一个 get()方法。我们来看看几个栗子:
总结
函数式接口其实差别不大,只是参数和返回的不同,只要想明白其中的一种,其他的也就懂了。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-07
本文作者:何小H
本文来自:“掘金”,了解相关信息可以关注“掘金”