Java 8 - 07 复合 Lambda 表达式
文章目录
- Pre
- Comparator 比较器复合
- 逆序 reversed()
- 比较器链 thenComparing
- Predicate 谓词复合
- negate
- and / or
- Function 函数复合
- andThen
- compose
Pre
前面几个我们使用lambda表达式,都用的是默认的抽象方法,还记得不?
事实上,许多函数式接口,比如用于传递Lambda表达式的 Comparator 、 Function 和 Predicate 都提供了允许你进行复合的方法
这些函数接口中的其他方法(default方法或者static方法) 有啥用呢?
在实际使用场景中,可以把多个简单的Lambda复合成复杂的表达式。 比如 可以让两个谓词之间做一个 or 操作,组合成一个更大的谓词,还可以让一个函数的结果成为另一个函数的输入等等
接下来我们挑几个函数式接口来实战一下
Comparator 比较器复合
是不是懵了,这么多default 和 static方法 。。。
不急,一点点看
Java 8 - Lambda 和方法引用实战 中推导了一个表达式如下
enginnerList.sort(comparing(Enginner::getJob));
逆序 reversed()
对enginnerList进行排序,比较工程师的职位 , 这个时候如果想倒叙排列呢?
用不着去建立另一个 Comparator 的实例。接口有一个默认方法 reversed 可以使给定的比较器逆序。因此仍然用开始的那个比较器,只要修改一下前一个例子就可以对Enginner按职位递减排序:
enginnerList.sort(comparing(Enginner::getJob).reversed());
比较器链 thenComparing
如果发现有两个Engineer的职位一样 怎么办?哪个Engineer应该排在前面呢?你可能
需要再提供一个 Comparator 来进一步定义这个比较,比如再按年龄排序。 thenComparing 方法就是做这个用的。它接受一个函数作为参数(就像 comparing 方法一样),如果两个对象用第一个 Comparator 比较之后是一样的,就提供第二个 Comparator 。
enginnerList.sort(comparing(Enginner::getJob).reversed() // 倒叙.thenComparing(Enginner::getAge)); // 职位相同时, 进一步按年龄排序
Predicate 谓词复合
谓词接口包括三个方法: negate 、 and 和 or ,让你可以重用已有的 Predicate 来创建更复杂的谓词。
negate
比如,我们可以使用 negate 方法来返回一个 Predicate 的非 。
例如 不是Java工程师
// 产生现有 Predicate 对象 redApple 的非Predicate<Apple> notRedApple = redApple.negate();
and / or
还可能想要把两个Lambda用 and 方法组合起来,比如一个苹果既是红色又比较重:
// 链接两个谓词来生成另 一个 Predicate 对象Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight() > 150);
可以进一步组合谓词,表达要么是重(150克以上)的红苹果,要么是绿苹果
// 链接 Predicate 的 方法来构造更复杂 Predicate 对象Predicate<Apple> redAndHeavyAppleOrGreen = redApple.and(a -> a.getWeight() > 150)
.or(a -> "green".equals(a.getColor()));
请注意, and 和 or 方法是按照在表达式链中的位置,从左向右确定优先级的。因此, a.or(b).and© 可以看作 (a || b) && c 。
Function 函数复合
还可以把 Function 接口所代表的Lambda表达式复合起来。 Function 接口为此配了 andThen 和 compose 两个默认方法,它们都会返回 Function 的一个实例
andThen
andThen 方法会返回一个函数,它先对输入应用一个给定函数,再对输出应用另一个函数。
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.andThen(g); // 数学上会写作 g(f(x)) 或 (g o f)(x)
int result = h.apply(1); // 这将返回4
compose
compose 方法,先把给定的函数用作 compose 的参数里面给的那个函数,然后再把函数本身用于结果。
比如在上一个例子里用 compose 的话,它将意味着 f(g(x)) ,而 andThen 则意味着 g(f(x)) :
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.compose(g); // 数学上会写作 f(g(x)) 或 (f o g)(x)
int result = h.apply(1); // 这将返回3
Java 8 - 07 复合 Lambda 表达式相关推荐
- Java 8中使用Lambda表达式的策略模式
策略模式是" 设计模式:可重用对象的元素"书中的模式之一 . 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换. 策略使算法独立于使用该算法的客户端而变化 ...
- Java 函数式编程和 lambda 表达式
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...
- 精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...
有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格--iterator 和 for-each 循环--比 Java ...
- Java基础教程:Lambda表达式
Java基础教程:Lambda表达式 引入Lambda Java 是一流的面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象.在 Java ...
- Java 8 新特性 lambda表达式
/ Created by Manager on 2021/4/1. Java 8 新特性 lambda表达式 StreamAPI 新日期 新注解 */ 视频连接 1https://www.bilibi ...
- Java 8 新特性Lambda 表达式
Java 8 新特性Lambda 表达式 一.常用循环 二.匿名内部类 三.排序集合 四.循环打印对象 五.根据条件修改 六.排序 七.求和 八.统计方法 九.材料 一.常用循环 public cla ...
- java 函数式接口与lambda表达式的关系
函数式接口与lambda表达式的关系 在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没 ...
- Java 8系列之Lambda表达式
概述 使用Lambda表达式也有一段时间了,有时候用的云里雾里的,是该深入学习Java 8新特性的时候了.作为Java最大改变之一的Lambda表达式,其是Stream的使用基础,那就以它开始吧. 这 ...
- What?Java这么神奇的lambda表达式
目录: 1.面向对象的思想和函数式编程思想的概述 2.解决冗余的Runnable代码问题 3.Lambda标准格式及使用 4.对于Lambda表达式例子的解释 1.面向对象的思想和函数式编程思想的概述 ...
最新文章
- 设计模式C#描述——单例与多例模式
- 欧盟调查或拖累进程 高通收购NXP一波三折
- 一起学DHCP系列(五)指派、获取
- 校园计算机故障解决方论文法,计算机故障与处理-计算机专业毕业论文.pdf
- TypeError: 'module' object is not callable 原因分析(python模块导入注意事项)
- 【数据结构与算法】压缩矩阵的Java实现
- omnigraffle 画曲线_「技法」三步学会用绘图利器 OmniGraffle 绘制流程图
- eclipse配置tomcat,并部署一个Java web项目到tomcat上
- java并发多线程面试_Java多线程并发面试问答
- 锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制
- Word技能-更改 Normal 模板 (Normal.dotm)
- 介绍NVivo 12 Mac
- 第七章-寻找软件的注册码
- 测量MATLAB安装哪些产品,matlab需要安装哪些工具箱
- 小程序确定取消弹窗_小程序弹窗取消和确定 微信小程序怎么做
- Python 自动化办公之自动识别并点击按钮
- 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵
- PTA换硬币(枚举)
- html中的圆周率如何调用,谁算出来的圆周率
- 用Excel曲面图做等高线图(仿罗兰贝格消费者价值体系图)
热门文章
- python prophet 预言家预知未来
- 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)
- 异常检测-孤立森林(IsolationForest)
- 5-spark学习笔记-spark集群应用与监控
- BPMF论文辅助笔记:采样Ui 部分推导
- NTU课程笔记 MAS714(8) 分治与排序
- 文巾解题 LCP 11. 期望个数统计
- python库整理:heapq 最小堆
- Python 知识点全解析系列之列表推导式(list comprehension)
- 从无到有算法养成篇-栈和队列·栈