【Java8】@FunctionalInterface
阅读目录
- 什么是函数式接口(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对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法
函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
如下代码不会报错:
![](/assets/blank.gif)
@FunctionalInterfaceinterface GreetingService{void sayMessage(String message);default void doSomeMoreWork1(){// Method body}default void doSomeMoreWork2(){// Method body}}
![](/assets/blank.gif)
函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
如下代码不会报错:
![](/assets/blank.gif)
@FunctionalInterfaceinterface GreetingService {void sayMessage(String message);static void printHello(){System.out.println("Hello");}}
![](/assets/blank.gif)
函数式接口里允许定义java.lang.Object里的public方法
函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现;
如下代码不会报错:
![](/assets/blank.gif)
@FunctionalInterfaceinterface GreetingService {void sayMessage(String message);@Overrideboolean equals(Object obj);}
![](/assets/blank.gif)
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相关推荐
- java8 functionalinterface注解_【Java8】@FunctionalInterface
阅读目录 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函 ...
- 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet
文章目录 1.堆栈/队列/数组/链表:数据结构即计算机组织管理数据的方式,堆栈指的是内存图中的栈,不是堆 2.红黑树:二查,二查平,二查平1倍 3.List子接口:集合,IndexOutOfBound ...
- 【java8】中stream的.findAny().orElse (null) 是什么意思?
举例: List<User> userList = new ArrayList(); User user1 = userList.stream().filter(user -> &q ...
- 【Java8】函数式接口
一.前言 早期的程序员在JDK1.5时期,掌握泛型.枚举.反射 基本上就可以了,随着JDK不断迭代升级,到相对于稳定的JDK1.8版本,扩展了大量的知识点,例如:lambda表达式,链式编程,函数式接 ...
- 【Java8】 lambda 特性讲解
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中).使用 Lambda 表达式可以使代码变的更加简洁 ...
- java8 foreach 伟参_【java8】为java8的foreach正名
首先为自己没有经过严格测试得出的错误结论感到抱歉,原博文,测试完感觉自己发现了一个新bug,后来思前想后觉得不应该是这样的,如果效率差的这么多,jdk的开发人员会不去优化它吗,但是怎么重复测试任然得到 ...
- 【JAVA8】Map新方法,别再重复造车轮了
文章目录 getOrDefault forEach compute computeIfAbsent computeIfPresent merge putIfAbsent remove(key,valu ...
- 【java8】LocalDateTime、LocalDate与LocalTime的基本使用
一.介绍 java8之前有Date类和Calendar类,但存在着不少缺陷,在java8中Date类的很多方法已经被弃用. Date类不格式化可读性差,所以就需要格式化,使用SimpleDateFor ...
- 【java8】并行流Stream
流在处理数据进行一些迭代操作的时候确认很方便,但是在执行一些耗时或是占用资源很高的任务时候,串行化的流无法带来速度/性能上的提升,并不能满足我们的需要. 通常我们会使用多线程来并行或是分片分解执行任务 ...
最新文章
- 为什么在Docker里使用gdb调试器会报错
- centos7 glpi 安装 Fusioninventory-agent 自测部署安装
- 配置postfix+dovecot+mysql+postfixadmin+squirrelmail 邮件系统笔记
- sob攻略超详细攻略_2020云南旅游超详细必看攻略(附带云南美食景点攻略)
- 王栋: 要做好推荐,只有技术是不够的
- 利用EfficientNet-B5从眼底摄影检测糖尿病视网膜病变的严重程度
- 截取指定字符前_Excel字符函数(1):利用3个函数提取邮箱中的域名
- linux九九乘法表代码,C语言输出九九乘法表代码及解析
- 移动边缘计算(MEC)
- OCR文字识别算法总结
- 关于企业邮箱服务器经常被spamhaus反垃圾邮件组织拦截的排错方法分享
- Lab 3:自行车码表
- React开发(250):react项目理解 ant design loding控制页面转圈加载
- CentOS 7 安装 Mysql 8.0 教程
- windows与ipad互联传文件
- 【读书笔记】—无懈可击的web设计
- [corctf 2022] 部分
- 常用计算机控制芯片有哪些,干货|常见电源管理IC芯片有哪些?
- CUMT第一轮双月赛Web题解
- centos7万兆网卡不显示问题