您现在的位置是:首页 > 文章详情

Java8的函数式接口你真的了解吗?

日期:2020-05-06点击:480

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


函数式接口

如果你的好奇心使你翻看Runnable接口源代码,你会发现该接口被一个@FunctionalInterface的注解修饰,这是 Java 8 中添加的新注解,用于表示 「函数式接口」。

1

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

2

如果输入参数是基本类型,为了避免自动拆箱装箱,可以使用其他基本类型的函数接口。

Function

interface Function 接口包含一个apply方法、两个默认方法(compose、andThen)和一个静态方法identity。apply是接口的基本方法。compose、andThen是一对儿方法,他们的区别在于执行的顺序不同。

//返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象


default Function compose(Function<? super V, ? extends T> before) {
 Objects.requireNonNull(before); return (V v) -> apply(before.apply(v));

}


//返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。
default Function andThen(Function<? super R, ? extends V> after) {
 Objects.requireNonNull(after); return (T t) -> after.apply(apply(t));

}

3

Consumer

interface Consumer 接口包含一个void accept(T t);方法、默认方法andThen.

5

只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。

Predicate

interface Predicate接口包含一个boolean test(T t);方法,三个默认方法(and,negate,or),还有一个静态方法。我们也知道Predicate 接口是返回 boolean 类型的,所以一看就知道是条件判断的。举几个栗子吧:

4

只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。

Supplier

Supplier只有一个 get()方法。我们来看看几个栗子:

6

总结

函数式接口其实差别不大,只是参数和返回的不同,只要想明白其中的一种,其他的也就懂了。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-05-07
本文作者:何小H
本文来自:“掘金”,了解相关信息可以关注“掘金”

原文链接:https://yq.aliyun.com/articles/759043
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章