Java8的函数式接口你真的了解吗?
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
函数式接口
如果你的好奇心使你翻看Runnable接口源代码,你会发现该接口被一个@FunctionalInterface的注解修饰,这是 Java 8 中添加的新注解,用于表示 「函数式接口」。
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包中。如:
Functional-Package
如果输入参数是基本类型,为了避免自动拆箱装箱,可以使用其他基本类型的函数接口。
Function
interface Function 接口包含一个apply方法、两个默认方法(compose、andThen)和一个静态方法identity。apply是接口的基本方法。compose、andThen是一对儿方法,他们的区别在于执行的顺序不同。
//返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象
default Function compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before); return (V v) -> apply(before.apply(v));
}
//返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。
default Function andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after); return (T t) -> after.apply(apply(t));
}
Consumer
interface Consumer 接口包含一个void accept(T t);方法、默认方法andThen.
只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。
Predicate
interface Predicate接口包含一个boolean test(T t);方法,三个默认方法(and,negate,or),还有一个静态方法。我们也知道Predicate 接口是返回 boolean 类型的,所以一看就知道是条件判断的。举几个栗子吧:
只有一个默认方法也是和它的返回类型有关系,因为返回的是 void。
Supplier
Supplier只有一个 get()方法。我们来看看几个栗子:
总结
函数式接口其实差别不大,只是参数和返回的不同,只要想明白其中的一种,其他的也就懂了。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-07
本文作者:何小H
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
好程序员web前端培训分享详解JavaScript学习笔记构造函数
好程序员web前端培训分享详解JavaScript学习笔记构造函数,面向对象:首先,我们要明确,面向对象不是语法,是一个思想,是一种编程模式。面向: 面(脸),向(朝着)面向过程: 脸朝着过程 =》 关注着过程的编程模式面向对象: 脸朝着对象 =》 关注着对象的编程模式实现一个效果在面向过程的时候,我们要关注每一个元素,每一个元素之间的关系,顺序,。。。在面向过程的时候,我们要关注的就是找到一个对象来帮我做这个事情,我等待结果例子 : 我要吃面条面向过程用多少面粉用多少水怎么和面怎么切面条做开水煮面吃面面向对象找到一个面馆叫一碗面等着吃面向对象就是对面向过程的封装我们以前的编程思想是,每一个功能,都按照需求一步一步的逐步完成我们以后的编程思想是,每一个功能,都先创造一个面馆,这个面馆能帮我们作出一个面(完成这个功能的对象),然后用面馆创造出一个面,我们只要等到结果就好了创建对象的方式因为面向对象就是一个找到对象的过程所以我们先要了解如何创建一个对象调用系统内置的构造函数创建对象js 给我们内置了一个 Object构造函数这个构造函数...
- 下一篇
Hyperf 发布 socket.io 组件及 v1.1.30 版本 | 企业级的 PHP 微服务云原生协程框架
更新内容 本周更新主要发布 hyperf/socketio-server 组件,Socket.io 是一款流行的应用层实时通讯协议和框架,可以轻松实现应答、分组、广播。hyperf/socketio-server 支持了 Socket.io 的 WebSocket 传输协议。另修复了一些 🐛Bug, 继续提升 hyperf 的稳定性, 发布于 1.1.30 版, 建议用户更新此版本。 直接访问 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容 新增 #1616 新增 ORM 方法 morphWith 和 whereHasMorph。 #1651 新增 socket.io-server 组件。 #1666 #1669 新增 AMQP RPC 客户端。 修复 #1682 修复 RpcPoolTransporter 的连接池配置不生效的 BUG。 #1683 修复 RpcConnection 连接失败后,相同协程内无法正常重置连接的 BUG。 优化 #1670 优化掉 Cache 组件 一条无意义的删除指令。 关于 Hyperf Hyperf 是基于 Swoole ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Red5直播服务器,属于Java语言的直播服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库