死磕Lambda表达式(六):Consumer、Predicate、Function复合
你的无畏来源于无知。——《三体》
在上一篇文章(传送门)中介绍了Comparator复合,这次我们来介绍一下其他的复合Lambda表达式。
Consumer复合
Consumer
接口中,有一个默认方法andThen
,它的入参还是Consumer
接口的实例。做完上一个Consumer
的操作以后,再做当前Consumer
的操作,就像工厂的流水线一样,比如:
Consumer<Mask> brand = m -> m.setBrand("3M");
Consumer<Mask> type = m -> m.setType("N95");
Consumer<Mask> price = m -> m.setPrice(19.9);
Consumer<Mask> print = System.out::println;
brand.andThen(type)
.andThen(price)
.andThen(print)
.accept(new Mask());
上面的代码分别声明了4个Consumer
接口的实例,然后再把它们组装成一个流水线,先把口罩品牌赋值为3M,再把口罩类型赋值为N95,再把口罩价格赋值为19.9,最后把口罩实例打印出来,运行结果如下:
Mask{brand='3M', type='N95', price=19.9}
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
Predicate复合
Predicate接口一共有3个默认方法:negate
、and
和or
,用它们可以创建更加复杂的Predicate接口实例。
negate方法
negate方法就是做非运算。比如,判断口罩类型是N95:
Mask mask = new Mask("Honeywell", "N95",19.5);
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
System.out.println(isN95.test(mask));
运行结果为:
true
那么,使用negate方法以后,就变成了判断口罩类型不是N95:
Mask mask = new Mask("Honeywell", "N95",19.5);
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
System.out.println(isN95.negate().test(mask));
运行结果为:
false
and方法
and方法就是做与运算。比如:
Mask mask = new Mask("Honeywell", "N95",19.5);
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;
System.out.println(isN95.and(lessThan20).test(mask));
上面的代码分别声明了2个Predicate
接口的实例,分别是判断口罩类型是N95和判断口罩价格小于20,使用and
方法以后,表示口罩类型是N95 并且 口罩价格小于20,运行结果如下:
true
or方法
or方法就是做或运算。比如:
Mask mask = new Mask("Honeywell", "N95", 21.5);
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;
System.out.println(isN95.or(lessThan20).test(mask));
上面的代码分别声明了2个Predicate
接口的实例,分别是判断口罩类型是N95和判断口罩价格小于20,使用or
方法以后,表示口罩类型是N95 或者 口罩价格小于20,运行结果如下:
true
and方法和or方法组合使用
当and方法和or方法组合使用时,优先级是由在Lambda表达式链中的位置决定的,从左到右优先级从高到低,比如:
Mask mask = new Mask("3M", "N95", 21.5);
Predicate<Mask> is3M = m -> "3M".equals(m.getType());
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;
System.out.println(is3M.or(isN95).and(lessThan20).test(mask));
上面的代码分别声明了3个Predicate
接口的实例,分别是判断口罩品牌是3M、判断口罩类型是N95和判断口罩价格小于20,3个Predicate
组合以后是is3M.or(isN95).and(lessThan20)
,根据从左到右优先级从高到低,组合以后的逻辑是(is3M || isN95 ) && lessThan20
,所以运行结果如下:
false
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
Function复合
Function接口一共有2个默认方法:andThen
和compose
,用它们可以创建更加复杂的Function接口实例。
andThen方法
Function
接口的andThen
方法,和Consumer
接口的类似,它的入参还是Function
接口的实例。做完上一个Function
的操作以后,再做当前Function
的操作,比如:
Function<Integer, Integer> plusTwo = x -> x + 2;
Function<Integer, Integer> timesThree = x -> x * 3;
System.out.println(plusTwo.andThen(timesThree).apply(1));
System.out.println(plusTwo.andThen(timesThree).apply(2));
System.out.println(plusTwo.andThen(timesThree).apply(3));
上面的代码分别声明了2个Function
接口的实例,先加2,然后再乘以3,也就是(x + 2) * 3
,运行结果如下:
9
12
15
compose方法
Function
接口的compose
方法,和andThen
方法相反的,先做当前Function
的操作,然后再做上一个Function
的操作,比如:
Function<Integer, Integer> plusTwo = x -> x + 2;
Function<Integer, Integer> timesThree = x -> x * 3;
System.out.println(plusTwo.compose(timesThree).apply(1));
System.out.println(plusTwo.compose(timesThree).apply(2));
System.out.println(plusTwo.compose(timesThree).apply(3));
上面的代码分别声明了2个Function
接口的实例,先乘以3,然后再加2,也就是(x * 3) + 2
,运行结果如下:
5
8
11
《死磕Lambda表达式》系列
- 死磕Lambda表达式(一):初识Lambda
- 死磕Lambda表达式(二):Lambda的使用
- 死磕Lambda表达式(三):更简洁的Lambda
- 死磕Lambda表达式(四):常用的函数式接口
- 死磕Lambda表达式(五):Comparator复合
- 死磕Lambda表达式(六):Consumer、Predicate、Function复合
微信公众号:万猫学社
微信扫描二维码
获得更多Java技术干货
死磕Lambda表达式(六):Consumer、Predicate、Function复合的更多相关文章
- 死磕Lambda表达式(一):初识Lambda
弱小和无知不是生存的障碍,傲慢才是.--<三体> 什么是Lambda表达式 Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表.函数主体.返回 ...
- 死磕Lambda表达式(二):Lambda的使用
城市就是森林,每一个男人都是猎手,每一个女人都是陷阱.--<三体> 在哪使用Lambda表达式? 在上一篇文章(传送门)中介绍了Lambda表达式的基本语法,其中的举了一个Lambda表达 ...
- 死磕Lambda表达式(三):更简洁的Lambda
我们都是阴沟里的虫子,但总还是得有人仰望星空.--<三体> 在之前的文章中介绍了Lambda表达式的基本语法和正确使用姿势,这次我来介绍一些Lambda更简洁的用法. 欢迎关注微信公众号: ...
- 死磕Lambda表达式(四):常用的函数式接口
失去人性,失去很多:失去兽性,失去一切.--<三体> 在Java8支持Lambda表达式以后,为了满足Lambda表达式的一些典型使用场景,JDK为我们提供了大量常用的函数式接口.它们主要 ...
- 死磕Lambda表达式(五):Comparator复合
给岁月以文明,而不是给文明以岁月.--<三体> 在上一篇文章(传送门)中介绍了JDK为我们提供的常用函数式接口,JDK不仅提供的这些函数式接口,其中一些接口还为我们提供了实用的默认方法,这 ...
- C++ 11 Lambda表达式、auto、function、bind、final、override
接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...
- 五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》
系列文章 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的 ...
- java8 array、list操作 汇【2】)- (Function,Consumer,Predicate,Supplier)应用
static class UserT { String name; public UserT(String zm) { this.name=zm; } public String getName() ...
- Lambda表达式与Function接口
Lambda表达式是一个匿名函数.C++ 11和 java 8 相继引入了有关对Lambda表达式的支持. Lambda表达式对于高级语言而言并不是必要的,对于Java而言它的功能和一个简易的接口差不 ...
随机推荐
- 【新功能】MaxCompoute禁止Full Scan功能开放
摘要: 2018年1月10日,MaxCompute禁止Full Scan功能开放.对于新创建的project默认情况下执行sql时,针对该project里的分区表不允许全表扫描,必须有分区条件指定需要 ...
- PxCook+photoshop实现傻瓜式切图(推荐小白使用)
确定需求 刚入门前端的小伙伴经过一个阶段的学习,已经准备小试牛刀了.但看到设计师给出的psd图,又头疼了,天啊撸,怎么办,我不会切图啊.今天我就带领小白学习傻瓜式切图.包学包会.( ̄▽ ̄)" ...
- [红日安全]Web安全Day9 - 文件下载漏洞实战攻防
本文由红日安全成员: Once 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名字 ...
- hadoop HDFS扩容
1.纵向扩容(添加硬盘) 1.1 添加硬盘 确定完成添加,运行 lsblk 查看硬盘使用情况 1.2 硬盘分区 fdisk /dev/sdb #对新硬盘sdb进行分区 m 帮助 n 添加一个分区 p ...
- RAC修改VIP地址
目录 当前环境 1.通过[srvctl config]确认当前VIP地址. 2.关闭dbconsole[对应的em] 3.关闭数据库实例 4.关闭asm实例 5.关闭结点服务 6.修改两个节点的/et ...
- 本地Hadoop集群搭建
什么是Hadoop? Hadoop是一个开源的Apache项目,通常用来进行大数据处理. Hadoop集群的架构: master节点维护分布式文件系统的所有信息,并负责调度资源分配,在Hadoop集群 ...
- element中的树形组件,如何获取父级菜单的id
一般多选的树形组件,使用getCheckedNodes()方法只能获取到本级的菜单id,只有在子菜单全部选中的情况下才会选中上级.但我们想要不全选中子级的情况下也要获取它的上级,甚至上上级等,怎么办呢 ...
- 「CSS」常见的清除浮动方法
下面介绍几种清除浮动的方案,供大家参考: 使用额外的标签clear:both .parent {padding: 10px;width: 200px;background: red;} .child ...
- 深度学习与人类语言处理-语音识别(part3)
上节回顾深度学习与人类语言处理-语音识别(part2),这节课我们接着看seq2seq模型怎么做语音识别 上节课我们知道LAS做语音识别需要看完一个完整的序列才能输出,把我们希望语音识别模型可以在听到 ...
- POI小demo
使用poi需要先下载相关jar包(http://download.csdn.net/detail/wangkunisok/9454545) poi-3.14-20160307.jar poi-ooxm ...