java8实战读书笔记:复合Lambda表达式

Wesley13
• 阅读 739

本节将重点探讨复合Lambda表达式的使用。在阅读本篇之前建议您先阅读:

java8实战读书笔记:Lambda表达式语法与函数式编程接口,因为本篇是上篇的补充。

本书为博主在学习《java8实战》时的笔记。

比较器复合

java8实战读书笔记:复合Lambda表达式

上面是JDK8中java.util.Comparator接口,相比jdk1.7增加了好多方法,也许你会觉得奇怪,为什么接口中还能定义方法,原因是JDK8中,可以为接口添加默认实现,使用default关键字定义。

我们可以这样定义一个比较器:

1Comparator< Apple>  c = Comparator.comparing(Apple::getWeight());

其等价为:

1Comparator< Apple>  c = Comparator.comparing(  (a) -> a.getWeight()  );

为什么可以这样写呢?因为Comparator定义了如下静态方法:

java8实战读书笔记:复合Lambda表达式

逆序

Comparator定义了一个静态方法,reversed,故我们不需要重新再定义一个比较器,我们可以这样就能实现逆序排序:

1List< Apple> apples = new ArrayList<>();2apples.sort(  Comparator.comparing(Apple::getWeight()).reversed()  );

比较器链

如果要支持多重排序呢?例如先根据苹果的重量,如果重量相同就按照颜色排序,那如何来实现呢?

1apples.sort(  Comparator.comparing(Apple::getWeight()).thenComparing(  Apple::getColor()  ) );

之所以可以使用上述表达式,是因为Comparator定义了如下方法:

1default <U extends Comparable<? super U>> Comparator<T> thenComparing( Function<? super T, ? extends U> keyExtractor)2{3    return thenComparing(comparing(keyExtractor));4}

温馨提示:Comparator中定义很多thenComparing重载方法,在具体使用过程中,可以先看看其函数声明。

谓词复合

提到谓词复合,我们就不得不提Predicate函数式编程接口,其类图如下所示:

java8实战读书笔记:复合Lambda表达式

  • and:与

  • negate:非

  • or:或

温馨提示:and 和 or 是按照在表达式链中的位置,从左向右确定优先级的。因此, a.or(b).and(c) 可以看作 (a || b) && c 。

使用示例:从苹果列表中找出所有红色的,并且重量超过150的苹果:

1apples.filter((a -> "red".equals(a.getColor())).and(  a -> a.getWeight() > 150 ));2a -> "red".equals(a.getColor())  是 (Apple a ) -> "red".equals(a.getColor())的简写。

函数复合

函数复合,其对应的函数式编程接口为Function,其类图如下:

java8实战读书笔记:复合Lambda表达式

  • addThen
    andThen 方法会返回一个函数,它先对输入应用一个给定函数,再对输出应用另一个函数。
    例如:
    Function f = x -> x + 1;
    Function g = x -> x * 2;
    Function h = f.andThen(g);
    int result = h.apply(1);  // 其结果返回4,类似与数学公式  f(g(x))。

  • compose
    先把给定的函数用作 compose 的参数里面给的那个函数,然后再把函数本身用于结果。与addThen的函数应用方向相反,同样举例说明如下:
    Function f = x -> x + 1;
    Function g = x -> x * 2;
    Function h = f.compose(g);
    int result = h.apply(1);  // 其结果返回3,类似与数学公式  g(f(x))。


更多文章请关注微信公众号:

java8实战读书笔记:复合Lambda表达式

一波广告来袭,作者新书《RocketMQ技术内幕》已出版上市:

java8实战读书笔记:复合Lambda表达式

《RocketMQ技术内幕》已出版上市,目前可在主流购物平台(京东、天猫等)购买,本书从源码角度深度分析了RocketMQ NameServer、消息发送、消息存储、消息消费、消息过滤、主从同步HA、事务消息;在实战篇重点介绍了RocketMQ运维管理界面与当前支持的39个运维命令;并在附录部分罗列了RocketMQ几乎所有的配置参数。本书得到了RocketMQ创始人、阿里巴巴Messaging开源技术负责人、Linux OpenMessaging 主席的高度认可并作序推荐。目前是国内第一本成体系剖析RocketMQ的书籍。

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java8读书笔记:探究java8流收集数据原理
java8专栏目录:1.java8实战读书笔记:Lambda表达式语法与函数式编程接口(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzIzNzgyMjYxOQ%3D%3D%26mid%3D2247484246%
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这