读书笔记——《Java 8 实战》系列之复合 Lambda 表达式

本贴最后更新于 2704 天前,其中的信息可能已经斗转星移

在上一篇博客中我们一起学习了使用方法引用的方式来重复使用现有的方法并直接传递它们,方法引用能够进一步地简化我们的 Lambda 表达式。在实际问题的处理中,有时候我们需要多个 Lambda 表达式同时进行工作,Java 同样允许我们将多个简单的 Lambda 表达式复合成一个更复杂,完成功能更多的复杂表达式。比如,我们可以将两个谓词做一个 or 的操作,从而组成一个更强大的谓词;或者我们可以让一个函数的结果变成另一个函数的输入(类似于链式处理)。

  • 比较器复合(Comparator 的复合)

1.逆序比较器

  • Comparator reversed() 返回一个逆序后的 Comparator
students.sort(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub return o1.getAvgScore().compareTo(o2.getAvgScore()); } }.reversed());

2.比较器链

如果使用了上面的比较器后,发现两个学生的平均成绩相同,你可能希望此时按照它们的身高进行排列。此时我们就需要
Comparator thenComparing(Comparator<? super T> other)这个方法来设定当第一个比较器中比较的两个元素相同时该如何进行排序。

students.sort(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub return o1.getAvgScore().compareTo(o2.getAvgScore()); } }.reversed().thenComparing(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // TODO Auto-generated method stub return o1.getHeight().compareTo(o2.getHeight()); } }));
  • 谓词复合(Predicate 复合)

谓词的接口中提供了:negate,and 和 or 三个方法,有点类似于我们逻辑运算符中的非,与还有或。比如:

Predicate<Student> highStudents = s -> s.getHeight()>=180;

比如我们想要获得身高小于 180cm 的学生:

Predicate<Student> notHighStudents = highStudents.negate();

我们还可以将两个谓词条件结合起来,比如获得身高大于 180cm,且平均分大于 90 的学生

Predicate<Student> highAndHighScoreStudents = highStudents.and(s -> s.getAvgScore()>90);

我们还可以进一步组合谓词,比如要不然是身高大于 180 且平均分大于 90 分,要不然是平均分小于 60 的学生

Predicate<Student> complicatedPredicate = highStudents.and(s -> s.getAvgScore()>90).or(s -> s.getAvgScore()<60);

这种复合的表达式满足了我们更多的需求,但是读起来确仍然和问题的陈述差不多。需要注意的是,and 和 or 方法是按照在表达式链中的位置,从左向右确定优先级的。因此 a.or(b).and(c)也可以看作是 (a||b) && c

  • 函数复合

我们同样可以把 Function 接口所代表的 Lambda 表达式复合起来。Function 接口提供了两个 andThen 和 compose 两个默认方法,它们都会返回 Function 的一个实例。

andThen 方法会返回一个函数,它会将输入应用给调用这个方法的函数,再将结果应用给这个方法的参数函数。听起来有一些抽象,我们一起来看一个例子:

Function<Integer,Integer> f = x ->x + 1; Function<Integer,Integer> g = x ->x * 2; //先将参数x传入给调用andThen方法的f函数,再将f函数的结果传给andThen方法的参数g函数,得到返回值 Function<Integer,Integer> h = f.andThen(g); //结果返回是4 System.out.println(h.apply(1));

相似的 compose 方法,执行顺序与 andThen 相反,它会先将输入应用给方法参数的函数,再将结果应用给调用这个方法的函数,还是上面的那个例子:

Function<Integer,Integer> f = x ->x + 1; Function<Integer,Integer> g = x ->x * 2; //先将参数x传入给compose方法的参数g函数,再将g函数的结果传给调用compose方法的f函数,得到返回值 Function<Integer,Integer> h = f.compose(g); //结果返回是3 System.out.println(h.apply(1));

下图说明了这两个方法的区别
005f2f238e8e4f6e811d92ff5dca46df-andThen.png

各位同学,到这里,博主就已经用五篇博客将行为参数化Lambda 表达式(一)Lambda 表达式(二)方法引用,复合 Lambda 表达式这几个重要的概念介绍了一遍。如果大家觉得哪里写的有问题,欢迎大家与我一起讨论。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • Java

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

    3194 引用 • 8214 回帖
  • Lambda
    24 引用 • 19 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 608 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 76 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 380 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 819 关注
  • danl
    163 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 76 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 635 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1115 回帖 • 119 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 389 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 901 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 650 关注
  • 生活

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

    230 引用 • 1454 回帖
  • Node.js

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

    139 引用 • 269 回帖
  • PostgreSQL

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

    22 引用 • 22 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 516 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 19 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    157 引用 • 290 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 1 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 105 关注
  • Outlook
    1 引用 • 5 回帖