文章目录

  • 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 表达式相关推荐

  1. Java 8中使用Lambda表达式的策略模式

    策略模式是" 设计模式:可重用对象的元素"书中的模式之一 . 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换. 策略使算法独立于使用该算法的客户端而变化 ...

  2. Java 函数式编程和 lambda 表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  3. 精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...

    有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格--iterator 和 for-each 循环--比 Java ...

  4. Java基础教程:Lambda表达式

    Java基础教程:Lambda表达式 引入Lambda Java 是一流的面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象.在 Java ...

  5. Java 8 新特性 lambda表达式

    / Created by Manager on 2021/4/1. Java 8 新特性 lambda表达式 StreamAPI 新日期 新注解 */ 视频连接 1https://www.bilibi ...

  6. Java 8 新特性Lambda 表达式

    Java 8 新特性Lambda 表达式 一.常用循环 二.匿名内部类 三.排序集合 四.循环打印对象 五.根据条件修改 六.排序 七.求和 八.统计方法 九.材料 一.常用循环 public cla ...

  7. java 函数式接口与lambda表达式的关系

    函数式接口与lambda表达式的关系 在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没 ...

  8. Java 8系列之Lambda表达式

    概述 使用Lambda表达式也有一段时间了,有时候用的云里雾里的,是该深入学习Java 8新特性的时候了.作为Java最大改变之一的Lambda表达式,其是Stream的使用基础,那就以它开始吧. 这 ...

  9. What?Java这么神奇的lambda表达式

    目录: 1.面向对象的思想和函数式编程思想的概述 2.解决冗余的Runnable代码问题 3.Lambda标准格式及使用 4.对于Lambda表达式例子的解释 1.面向对象的思想和函数式编程思想的概述 ...

最新文章

  1. 设计模式C#描述——单例与多例模式
  2. 欧盟调查或拖累进程 高通收购NXP一波三折
  3. 一起学DHCP系列(五)指派、获取
  4. 校园计算机故障解决方论文法,计算机故障与处理-计算机专业毕业论文.pdf
  5. TypeError: 'module' object is not callable 原因分析(python模块导入注意事项)
  6. 【数据结构与算法】压缩矩阵的Java实现
  7. omnigraffle 画曲线_「技法」三步学会用绘图利器 OmniGraffle 绘制流程图
  8. eclipse配置tomcat,并部署一个Java web项目到tomcat上
  9. java并发多线程面试_Java多线程并发面试问答
  10. 锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制
  11. Word技能-更改 Normal 模板 (Normal.dotm)
  12. 介绍NVivo 12 Mac
  13. 第七章-寻找软件的注册码
  14. 测量MATLAB安装哪些产品,matlab需要安装哪些工具箱
  15. 小程序确定取消弹窗_小程序弹窗取消和确定 微信小程序怎么做
  16. Python 自动化办公之自动识别并点击按钮
  17. 【背包DP练习】洛谷 P5020货币系统 P1757通天之分组背包 P1064[NOIP2006 提高组]金明的预算方案 P5322 [BJOI2019]排兵布阵
  18. PTA换硬币(枚举)
  19. html中的圆周率如何调用,谁算出来的圆周率
  20. 用Excel曲面图做等高线图(仿罗兰贝格消费者价值体系图)

热门文章

  1. python prophet 预言家预知未来
  2. 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)
  3. 异常检测-孤立森林(IsolationForest)
  4. 5-spark学习笔记-spark集群应用与监控
  5. BPMF论文辅助笔记:采样Ui 部分推导
  6. NTU课程笔记 MAS714(8) 分治与排序
  7. 文巾解题 LCP 11. 期望个数统计
  8. python库整理:heapq 最小堆
  9. Python 知识点全解析系列之列表推导式(list comprehension)
  10. 从无到有算法养成篇-栈和队列·栈