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

云栖号资讯:【点击检查更多职业资讯】
在这里您能够找到不同职业的第一手的上云资讯,还在等什么,快来!


函数式接口

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

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

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包中。如:

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

Functional-Package

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

假如输入参数是根本类型,为了防止主动拆箱装箱,能够运用其他根本类型的函数接口。

Function

interface Function 接口包括一个apply办法、两个默许办法(compose、andThen)和一个静态办法identity。apply是接口的根本办法。compose、andThen是一对儿办法,他们的差异在于履行的次序不同。

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

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

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

Consumer

interface Consumer 接口包括一个void accept(T t);办法、默许办法andThen.

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

只要一个默许办法也是和它的回来类型有联系,由于回来的是 void

Predicate

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

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

只要一个默许办法也是和它的回来类型有联系,由于回来的是 void。

Supplier

Supplier只要一个 get()办法。咱们来看看几个栗子:

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

总结

函数式接口其实不同不大,仅仅参数和回来的不同,只要想理解其间的一种,其他的也就懂了。

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

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

原文发布时刻:2020-05-07
本文作者:何小H
本文来自:“掘金”,了解相关信息能够重视“掘金”