阅读目录

什么是函数式接口(Functional Interface)

函数式接口用途

关于@FunctionalInterface注解

函数式接口里允许定义默认方法

函数式接口里允许定义静态方法

函数式接口里允许定义java.lang.Object里的public方法

JDK中的函数式接口举例

参考资料

什么是函数式接口(Functional Interface)

其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。

函数式接口用途

它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

如定义了一个函数式接口如下:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

}

那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello " + message);

关于@FunctionalInterface注解

Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。

正确例子,没有报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

}

错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。

提醒:加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法

函数式接口里允许定义默认方法

函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

default void doSomeMoreWork1()

{

// Method body

}

default void doSomeMoreWork2()

{

// Method body

}

}

函数式接口里允许定义静态方法

函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

static void printHello(){

System.out.println("Hello");

}

}

函数式接口里允许定义java.lang.Object里的public方法

函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;

如下代码不会报错:

@FunctionalInterface

interface GreetingService

{

void sayMessage(String message);

@Override

boolean equals(Object obj);

}

JDK中的函数式接口举例

java.lang.Runnable,

java.awt.event.ActionListener,

java.util.Comparator,

java.util.concurrent.Callable

java.util.function包下的接口,如Consumer、Predicate、Supplier等

java8 functionalinterface注解_【Java8】@FunctionalInterface相关推荐

  1. java8 functionalinterface注解_@FunctionalInterface注解的使用

    被@FunctionalInterface注解标记的类型表明这是一个函数接口.从概念上讲,函数接口只有一个抽象方法.如果接口声明的抽象方法覆写Object类的公共方法,那这方法不算作接口的抽象方法,因 ...

  2. java8 optional使用_[Java8]如何正确使用Optional

    Optional是Java8提供的为了解决null安全问题的一个API.善用Optional可以使我们代码中很多繁琐.丑陋的设计变得十分优雅.这篇文章是建立在你对Optional的用法有一定了解的基础 ...

  3. java注解 interface_java @FunctionalInterface注解详解

    下面要给大家介绍的就java @FunctionalInterface注解,对于@FunctionalInterface注解不大了解的人,可以通过下面的文章来了解一下哦. 在学习Lambda表达式的时 ...

  4. java8 lambda 视频_一文搞懂Java8 Lambda表达式(附带视频教程)

    Lambda表达式介绍 Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.通过Lambda表达式,可以替代我们以前经常写的匿名内部类来实现接口.Lambda表达式本质是一个 ...

  5. java8新特性_乐字节-Java8新特性-函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  6. 1.6 @FunctionalInterface注解

    在学习 Lambda 表达式时,我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口.@FunctionalInterface 就是用来指定某 ...

  7. Java @FunctionalInterface注解

    @FunctionalInterface 就是用来指定某个接口必须是函数式接口,所以 @FunInterface 只能修饰接口,不能修饰其它程序元素. 函数式接口就是为 Java 8 的 Lambda ...

  8. Java8 重复注解与类型注解

    Java8 重复注解与类型注解 定义重复注解 @Repeatable(RepeatAnnotations.class) 类型注解 @Target(ElementType.PARAMETER) /*** ...

  9. 基于Spring Boot应用@FunctionalInterface注解

    记录:291 场景:为了理解和应用@FunctionalInterface注解.@FunctionalInterface是Java语言规范定义函数式接口的注解.它作用在只有一个抽象方法的接口.默认方法 ...

最新文章

  1. C 语言中的 feof()函数
  2. android layout 对齐,安卓利用TableLayout实现控件列对齐
  3. 计算机组成原理码质变换,计算机组成原理负数的8421码
  4. 穿越剧_张宇鑫:穿越剧——从皇帝到乞丐
  5. Nginx 作为 WebSockets 代理
  6. 需要自己调研的框架,以及需要学习的内容
  7. nacos dataid修改配置文件_nacos 配置中心自动化运维之namespace坑
  8. 成功将本地文件添加到github仓库
  9. .Net中俩种使用不定参数的方法
  10. ASP.NET应用开发心得
  11. 指定版本_小米五一购机福利,购买Redmi7指定版本,送小米活塞耳机
  12. Tableau过期处理方法
  13. 高速PCB设计规范(二)
  14. java String字符串去除()里的内容
  15. 三星s8文档有html,三星s8有哪些特殊功能 这些绝对能让你羡慕
  16. Vscode中报错 CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
  17. 1997-2020年31省进出口总额
  18. 崩坏35.4版本什么时候更新
  19. h5微信页面在手机微信端和微信web开发者工具中都能正常显示,但是在pc端微信浏览器上打不开(显示空白)...
  20. Git的4 个阶段的撤销更改(通俗易懂)

热门文章

  1. CentOS 8.2 搭建私有云 NextCloud
  2. Oracle恶意代码(300天删除SYS.TAB$表)清除过程记录
  3. API 和 SDK 的区别
  4. AD定义pcb外形为异形
  5. mt6757介绍,mt6757原理图
  6. 通过百度普通IP定位API获取IP的地理位置java根据ip定位地理位置
  7. [IE技巧] IE8 网页兼容问题报告工具
  8. cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】
  9. Jina AI x 矩池云 |神经搜索引擎,一键构建
  10. 计算机程序设计基础结课报告,《计算机程序设计基础》课程地位及教学探讨