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

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

在上一篇博客中我们一起学习了使用方法引用的方式来重复使用现有的方法并直接传递它们,方法引用能够进一步地简化我们的 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思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Java

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

    3167 引用 • 8207 回帖
  • Lambda
    23 引用 • 19 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 1 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 224 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    169 引用 • 799 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • Swagger

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

    26 引用 • 35 回帖 • 12 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 10 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 11 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 46 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 526 关注
  • abitmean

    有点意思就行了

    21 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 2 关注
  • Thymeleaf

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

    11 引用 • 19 回帖 • 317 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 7 关注
  • danl
    61 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 682 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • sts
    2 引用 • 2 回帖 • 146 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 156 关注