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

简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 函数式接口 如果你的好奇心使你翻看Runnable接口源代码,你会发现该接口被一个@FunctionalInterface的注解修饰,这是 Java 8 中添加的新注解,用于表示 「函数式接口」。
+关注继续查看

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


函数式接口

如果你的好奇心使你翻看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包中。如:

_2

Functional-Package

2

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

Function

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

_1

_2

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
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
Java 编译器 BI
Java 函数式接口为什么这么神奇?
有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambda就是Java中函数式编程的体现,可以使用Lambda表达式创建一个函数式接口的对象,一定要确保接口中有且只有一个抽象方法,这样Lambda才能顺利的进行推导。
719 0
|
设计模式 Java 机器人
深入浅出聊聊Java函数式编程思想
深入浅出聊聊Java函数式编程思想
187 0
|
Java
Java从入门到精通十六(函数式接口编程)
判断一个接口是不是一个函数式接口的办法就是在接口上方添加注解@FunctionalInterface进行检测。 这其实就是一种函数式编程,体现了一种逻辑思维。函数式编程的一个非常方便的体现就是lambda表达式。所以函数式接口非常适合配合lambda去使用。
80 0
Java从入门到精通十六(函数式接口编程)
|
Java 程序员 开发者
Java 8系列之 Lambda的函数式接口(三)
Java 8系列之 Lambda的函数式接口(三)
132 0
Java 8系列之 Lambda的函数式接口(三)
|
并行计算 Java 调度
Java函数式编程(下)
我们从小学数学开始,就会慢慢形成函数的概念,简单的说,函数描述的就是自变量与因变量的映射关系。不管是在编程语言中,还是一个在系统设计中,都会用到函数思想来设计。它就像是一个黑箱子,我们在调用函数的时候,不用在乎函数内部的实现,只需要保证输入参数调用能返回想要的结果。运用函数思想去思考许多问题,都能简化模型,比如,调用一个接口或一个微服务,我只需关注传入的参数和返回正确的结果,而不需要过多关注内部实现。
116 0
Java函数式编程(下)
|
Java API 调度
Java函数式编程(上)
我们从小学数学开始,就会慢慢形成函数的概念,简单的说,函数描述的就是自变量与因变量的映射关系。不管是在编程语言中,还是一个在系统设计中,都会用到函数思想来设计。它就像是一个黑箱子,我们在调用函数的时候,不用在乎函数内部的实现,只需要保证输入参数调用能返回想要的结果。运用函数思想去思考许多问题,都能简化模型,比如,调用一个接口或一个微服务,我只需关注传入的参数和返回正确的结果,而不需要过多关注内部实现。
111 0
Java函数式编程(上)
|
Java
Java函数式接口
Java函数式接口
74 0
Java8新特性:函数式接口,方法与构造器引用
Java8新特性:函数式接口,方法与构造器引用
Java8新特性:函数式接口,方法与构造器引用
|
Java
Java 8 函数式接口java.util.function速查汇总
Java 8 函数式接口java.util.function速查汇总
123 0
相关产品
云迁移中心
推荐文章
更多