java8 functionalinterface注解_JDK8 新特性 @FunctionalInterface 函数式接口

在 JDK8 中,我们常用的一些接口 Callable、Runnable、Comparator 等都添加了 @FunctionalInterface 注解,那这个注解是什么意思呢?

什么是函数式接口

源码

package java.lang;

import java.lang.annotation.*;

/**

* An informative annotation type used to indicate that an interface

* type declaration is intended to be a functional interface as

* defined by the Java Language Specification.

*

* Conceptually, a functional interface has exactly one abstract

* method. Since {@linkplain java.lang.reflect.Method#isDefault()

* default methods} have an implementation, they are not abstract. If

* an interface declares an abstract method overriding one of the

* public methods of {@code java.lang.Object}, that also does

* not count toward the interface's abstract method count

* since any implementation of the interface will have an

* implementation from {@code java.lang.Object} or elsewhere.

*

*

Note that instances of functional interfaces can be created with

* lambda expressions, method references, or constructor references.

*

*

If a type is annotated with this annotation type, compilers are

* required to generate an error message unless:

*

*

*

The type is an interface type and not an annotation type, enum, or class.

*

The annotated type satisfies the requirements of a functional interface.

*

*

*

However, the compiler will treat any interface meeting the

* definition of a functional interface as a functional interface

* regardless of whether or not a {@code FunctionalInterface}

* annotation is present on the interface declaration.

*

* @jls 4.3.2. The Class Object

* @jls 9.8 Functional Interfaces

* @jls 9.4.3 Interface Method Body

* @since 1.8

*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface FunctionalInterface {}

复制代码

解释说明

通过 JDK8 源码 javadoc,可以知道这个注解有以下特点

该注解只能标记在 "有且仅有一个抽象方法" 的接口上

JDK8 接口中的静态方法和默认方法,都不算是抽象方法

由于所有接口默认继承 java.lang.Object,所以如果接口显示声明覆盖了 Object 中方法,那么也不算抽象方法

该注解不是必须的,如果一个接口符合 "函数式接口" 定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了 @FunctionInterface,那么编译器会报错。

下面这个接口就是一个正确的函数式接口:

@FunctionalInterface

public interface TestFunctionalInterface{

// 抽象方法

public void sub();

// java.lang.Object中的方法不是抽象方法

public boolean equals(Object var1);

// default不是抽象方法

public default void defaultMethod(){

}

// static不是抽象方法

public static void staticMethod(){

}

}

复制代码

函数式接口的作用

首先我们定义一个普通接口和一个函数式接口

5c9060d79a7bd93ddcf2ab177e1515b9.png

c5bde8e5b620a427203a0478a7531294.png

来看下将这个两个接口作为参数时,传参写法有什么不同

f76699f91c26623902ccecc595a20f6a.png

如上图可以看到,传入函数式接口的实例时,由于只有一个接口, ide 提示我们可以写成红框中的形式,是不是特别像是传入了一个函数(实际上传入的是一个接口的实现),这就是它为什么叫函数式接口的原因

总结:函数式接口的作用只是让接口的实现写起来像一个函数,以配合java 8 中的函数式编程

Java@FunctionalInterface注解详解 阅读详情

相关推荐

Java特性函数式接口注解@FunctionalInterface浅析

一个函数式接口是只有一个抽象方法(不包括继承自java.lang.Object的默认方法)的特定接口。这个抽象方法可以有任意数量的默认方法、静态方法以及覆盖Object类的方法。关键在于该接口必须确保只有一个未被实现的抽象方法。在 Java 中,函数式接口是专门为了配合 lambda 表达式和方法引用而设计的接口。单一抽象方法:函数式接口的核心特征是它只包含一个抽象方法。这意味着除了默认方法、静态方法或继承自的方法之外,它不能有其他的抽象方法。默认方法。

沛哥儿的专栏 5807

Java常用注解--@FunctionalInterface 函数式接口

必须是一个接口有且仅有一个抽象方法(允许包含默认方法或静态方法)。使用注解标记,编译器会强制校验是否符合条件。// 唯一抽象方法// 什么也不干,谁实现的就干什么// 默认方法不计入抽象方法数量// 模拟异步操作}).start();// 调用如何简化?// 定义回调接口// 使用回调try {// 调用时需实现所有方法(即使不关心某些情况)@Override@Override// 即使不需要处理失败,也必须实现空方法});问题。

Hanhahahahah的博客 2226

java函数式接口@FunctionalInterface的详细解析

关于函数式接口都可以使用lambda表达式实现具体涉及到lambda表达式可以看我之前的文章进行预习java中lambda表达式言归正传该注解主要是:一种信息性注释类型,用于指示接口类型声明是Java语言规范中定义的功能接口。通过该注解的源代码可看到其代码注释一个函数式接口有且只有一个精确的抽象方法。可以有多个静态方法或者默认方法, 每一个该类型的lambda表达式都会被匹配到这个抽象方法从概念上讲,一个功能接口只有一个抽象方法。因为默认方法有实现,所以它们不是抽象的。

码农研究僧的博客 1万+

JDK8新特性函数式接口@FunctionalInterface的使用说明

通过JDK8源码javadoc,可以知道这个注解有以下特点: 1、该注解只能标记在"有且仅有一个抽象方法"的接口上。 2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。 3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。 4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

aty 12万+

JDK8函数式接口@FunctionalInterface的使用详解

020博客地址汇总 2019年博客汇总 转载:https://blog.csdn.net/ZYC88888/article/details/86649994 我们常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。 通过JDK8源码javadoc,可以知道这个注解有以下特点: 1、该注解只能标记在”有且仅有一个抽象方法”的接口上。 2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。 3、接口默认继.

架构师的成长之路的博客 9808

Java8函数式接口及常用函数式接口

函数式接口、Supplier、Consumer、Predicate、Function等

代码大师麦克拉瑞的博客 6698

Java8新特性-函数式接口(lambda基础)

Java 8 函数式接口 - Functional Interface 阅读目录 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函数式接口里允许定义java.lang.Object里的public方法 JDK中的函数式接口举例 参考资料 ...

大帅的博客 5956

Java8函数式接口 @FunctionalInterface

Java8函数式接口 @FunctionalInterface一、函数式接口二、函数式接口用法2.1 Function 一、函数式接口Java 8 中,把那些仅有一个抽象方法的接口称为函数式接口。如果一个接口@FunctionalInterface 注解标注,表示这个接口被设计成函数式接口,只能有一个抽象方法,如果你添加多个抽象方法,编译时会提示“Multiple non-overriding abstract methods found in interface XXX”之类的错误。 标注为 @

alexdyysp的博客 797

(转)详解 @FunctionalInterface 注解的用法教程

最近在做团队代码 code review 的时候发现了有人使用了 @FunctionalInterface 注解。我对这个注解不是很熟悉,基本上没用过。于是我就问对应的开发人员,给我讲一讲这个注解的用法,为什么要用这个注解?他讲的不太全,于是我就查询了一些资料,分享给大家! 在讲 @FunctionalInterface 之前,我们先熟悉一下,什么是函数式接口(Functional Interface)? 函数式接口(Functional Interface) 函数式接口(Functional Interf

Leemeea的博客 6101

函数式接口@FunctionalInterface使用示例

通过JDK8源码javadoc,可以知道@FunctionalInterface有以下特点: 该注解只能标记在"有且仅有一个抽象方法"的接口上,表示函数式接口JDK8接口中的静态方法和默认方法,都不算是抽象方法。 接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中的方法,那么也不算抽象方法。 该注解不是必须的,如果一个接口符合"函数式编程"定义,那么加不加...

dayformyjob 2897

Java8新特性函数式接口FunctionalInterface详解

Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。本文将java8的一个新特性 函数式接口 单独深度剖析。函数式接口的范例:@FunctionalInterfaceJDK 8 中新增的注解类型,用来描述一个接口函数式接口。例如我们熟悉的Runnable 接口@FunctionalInterface public interface Runnable {

道哥的技术博客 4168

java8 functionalinterface注解_【Java8@FunctionalInterface

阅读目录什么是函数式接口(Functional Interface)函数式接口用途关于@FunctionalInterface注解函数式接口里允许定义默认方法函数式接口里允许定义静态方法函数式接口里允许定义java.lang.Object里的public方法JDK中的函数式接口举例参考资料什么是函数式接口(Functional Interface)其实之前在讲Lambda表达式的时候提到过,所谓的...

weixin_30828697的博客 286

Java 8 函数式接口讲解(@FunctionalInterface, Lambda)

Java 8 函数式接口讲解(@FunctionalInterface, Lambda) 什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,只能有一个抽象方法的接口(interface)称之为函数式接口 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 函数式接口用途 它们主要用在Lambda表达式和方法引用(实际上也...

我是guyue,guyue就是我O(∩_∩)O 849

二、lambda之函数式接口@FunctionalInterface的使用说明

函数式接口@FunctionalInterface的使用说明 我们常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。 通过JDK8源码javadoc,可以知道这个注解有以下特点: 该注解只能标记在"有且仅有一个抽象方法"的接口上。 JDK8接口中的静态方法和默认方法,都不算是抽象方法。 接口默认继承jav...

William 940

Java 8 函数式接口 - @FunctionalInterface

什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函数式接口里允许定义java.lang.Object里的public方法 JDK中的函数式接口举例 参考资料 ---------------------------------------------什么是函...

ppwwp的专栏 332

java】1.8新特性@FunctionalInterface函数式接口

什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 函数式接口用途 它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。 如定义了一个函数式接口如下: @FunctionalInterface interf.

开发随笔-猫咪酱 246

java8 functionalinterface注解_Java8新特性:函数式接口@FunctionalInterface使用说明

我们常用的一些接口Callable,Runnable,Comparator等在JDK8中都添加了@FunctionalInterface 注解: 通过JDK8 源码javadoc,可以知道@FunctionalInterface有以下特点:1.该注解只能标记在"有且仅有一个抽象方法"的接口上,表示函数式接口。2.JDK8接口中的静态方法和默认方法,都不算是抽象方法。3.接口默认继承 java.l...

weixin_39979948的博客 241
上一篇: Java怎么输入秒打印出时分_1.java小作业-计算1到100的整合-指定输入多少行输出就打印多少行-打印24小时60分钟每一分钟-重载基础练习-面向java编程初学者...
下一篇: java订单编号工具类_[idmiss-common] Java 工具类之- 顺序订单号的生成
爱吃葡萄的小狐狸
博客等级 码龄9年 21粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值