Java 8 之 函数式接口

本贴最后更新于 2894 天前,其中的信息可能已经物是人非

Java 8 引入了函数式接口(Functional Interfaces)的概念:如果一个接口只定义了唯一一个抽象方法,那么这个接口就成为函数式接口。同时,Java 8 中还引入了一个新的注解:@FunctionalInterface。可以把这个注解放在一个接口前,用于表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只定义了唯一一个抽象方法,虚拟机就会自动判断出该接口为一个函数式接口,不过最好在定义的函数式接口上加上 @FunctionalInterface 注解。对于加了 @FunctionalInterface 注解的接口,Java 编译器会在编译时对接口进行检查,如果发现该接口中定义的抽象方法不是一个,那么编译器会报错,这样就可以保证该接口的定义符合预期。

java.lang.Runnable 就是一个典型的函数式接口:

@FunctionalInterface public interface Runnable { void run(); }

另外,为了避免开发者创建大量的仅为 Lambda 表达式服务的函数式接口,Java 8 在 java.util.function 中增加了不少新的函数式通用接口。例如:

Function<T,R> :将 T 作为输入,返回 R 作为输出,他还包含了和其他函数组合的默认方法。

Predicate<T> :将 T 作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(与、或、非)。

Consumer<T> :将 T 作为输入,不返回任何内容,表示在单个参数上的操作。

简单讲解一下 Function<T,R>接口,它的定义如下:

@FunctionalInterface public interface Function { R apply(T var1); default Function compose(Functionsuper V, ? extends T> var1) { Objects.requireNonNull(var1); return (var2) -> { return this.apply(var1.apply(var2)); }; } default Function andThen(Functionsuper R, ? extends V> var1) { Objects.requireNonNull(var1); return (var2) -> { return var1.apply(this.apply(var2)); }; } static Function identity() { return (var0) -> { return var0; }; } }

可以看到 Function 接口中只有一个抽象方法 R apply(T var1) 这个方法唯一一个待实现的方法(抽象方法),这个方法将 Function 对象应用到输入的参数上,然后返回计算结果。

default Function compose(Functionsuper V, ? extends T> var1) 为一个默认方法,如不需要重写可以保留其默认实现。它返回一个先执行传入的函数对象的 apply 方法再执行当前函数对象的 apply 方法的函数对象。

default Function andThen(Functionsuper R, ? extends V> var1) 方法与它的上一个方法很相似,它返回一个先执行当前函数对象的 apply 方法再执行传入的函数对象的 apply 方法的函数对象。

static Function identity() 为一个静态方法,它返回一个执行了 apply()方法之后只会返回输入参数(即 apply()方法中直接输出输入的数据)的函数对象。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wizardforcel

    我还是觉得 rxjava 里面的 Func0 Func1 Func2 这些泛型好用一些。。。

  • someone756 via macOS

    Java9 都出来了,还在这 Java8 呢?

    1 回复
  • PrimaryKey via macOS

    .....

推荐标签 标签

  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 45 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    188 引用 • 3916 回帖 • 1 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    694 引用 • 537 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 36 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 167 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 522 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 3 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 7 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    172 引用 • 1547 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 268 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 252 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 653 关注
  • 笔记

    好记性不如烂笔头。

    312 引用 • 794 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1432 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 2 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 3 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 757 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    230 引用 • 1642 回帖 • 1 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 644 关注