阅读目录

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

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

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

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

函数式接口用途

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

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

    @FunctionalInterfaceinterface GreetingService {void sayMessage(String message);}

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

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

关于@FunctionalInterface注解

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

正确例子,没有报错

    @FunctionalInterfaceinterface GreetingService{void sayMessage(String message);}

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

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

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

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

如下代码不会报错:

    @FunctionalInterfaceinterface GreetingService{void sayMessage(String message);default void doSomeMoreWork1(){// Method body}default void doSomeMoreWork2(){// Method body}}

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

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

如下代码不会报错:

    @FunctionalInterfaceinterface GreetingService {void sayMessage(String message);static void printHello(){System.out.println("Hello");}}

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

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

如下代码不会报错:

    @FunctionalInterfaceinterface GreetingService  {void sayMessage(String message);@Overrideboolean equals(Object obj);}

JDK中的函数式接口举例

java.lang.Runnable,

java.awt.event.ActionListener,

java.util.Comparator,

java.util.concurrent.Callable

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

转载于:https://www.cnblogs.com/itplay/p/10721904.html

【Java8】@FunctionalInterface相关推荐

  1. java8 functionalinterface注解_【Java8】@FunctionalInterface

    阅读目录 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函 ...

  2. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet

    文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...

  3. 【java8】中stream的.findAny().orElse (null) 是什么意思?

    举例: List<User> userList = new ArrayList(); User user1 = userList.stream().filter(user -> &q ...

  4. 【Java8】函数式接口

    一.前言 早期的程序员在JDK1.5时期,掌握泛型.枚举.反射 基本上就可以了,随着JDK不断迭代升级,到相对于稳定的JDK1.8版本,扩展了大量的知识点,例如:lambda表达式,链式编程,函数式接 ...

  5. 【Java8】 lambda 特性讲解

    Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中).使用 Lambda 表达式可以使代码变的更加简洁 ...

  6. java8 foreach 伟参_【java8】为java8的foreach正名

    首先为自己没有经过严格测试得出的错误结论感到抱歉,原博文,测试完感觉自己发现了一个新bug,后来思前想后觉得不应该是这样的,如果效率差的这么多,jdk的开发人员会不去优化它吗,但是怎么重复测试任然得到 ...

  7. 【JAVA8】Map新方法,别再重复造车轮了

    文章目录 getOrDefault forEach compute computeIfAbsent computeIfPresent merge putIfAbsent remove(key,valu ...

  8. 【java8】LocalDateTime、LocalDate与LocalTime的基本使用

    一.介绍 java8之前有Date类和Calendar类,但存在着不少缺陷,在java8中Date类的很多方法已经被弃用. Date类不格式化可读性差,所以就需要格式化,使用SimpleDateFor ...

  9. 【java8】并行流Stream

    流在处理数据进行一些迭代操作的时候确认很方便,但是在执行一些耗时或是占用资源很高的任务时候,串行化的流无法带来速度/性能上的提升,并不能满足我们的需要. 通常我们会使用多线程来并行或是分片分解执行任务 ...

最新文章

  1. 为什么在Docker里使用gdb调试器会报错
  2. centos7 glpi 安装 Fusioninventory-agent 自测部署安装
  3. 配置postfix+dovecot+mysql+postfixadmin+squirrelmail 邮件系统笔记
  4. sob攻略超详细攻略_2020云南旅游超详细必看攻略(附带云南美食景点攻略)
  5. 王栋: 要做好推荐,只有技术是不够的
  6. 利用EfficientNet-B5从眼底摄影检测糖尿病视网膜病变的严重程度
  7. 截取指定字符前_Excel字符函数(1):利用3个函数提取邮箱中的域名
  8. linux九九乘法表代码,C语言输出九九乘法表代码及解析
  9. 移动边缘计算(MEC)
  10. OCR文字识别算法总结
  11. 关于企业邮箱服务器经常被spamhaus反垃圾邮件组织拦截的排错方法分享
  12. Lab 3:自行车码表
  13. React开发(250):react项目理解 ant design loding控制页面转圈加载
  14. CentOS 7 安装 Mysql 8.0 教程
  15. windows与ipad互联传文件
  16. 【读书笔记】—无懈可击的web设计
  17. [corctf 2022] 部分
  18. 常用计算机控制芯片有哪些,干货|常见电源管理IC芯片有哪些?
  19. CUMT第一轮双月赛Web题解
  20. centos7万兆网卡不显示问题

热门文章

  1. 深入理解Aho-Corasick自动机算法
  2. Java设计模式——工厂模式
  3. Shared pool内存块组成结构及4031错误原因分析
  4. Gentoo 安装日记 07 (stage3:复制解压stage包,并切换根目录)
  5. Shell - 脚本实现控制台一键编译运行 C++ 代码
  6. 剑指Offer #11 二进制中1的个数(想不到的骚操作)
  7. 面试,MySQL 搞透这 20 道就稳了
  8. 【实验】配置VRRP负载分担
  9. 【热点】黑客入侵的常用手段及防护措施分析
  10. 记 Arthas 实现一次 CPU 排查与代码热更新