带你读《2022技术人的百宝黑皮书》——stream的实用方法和注意事项(1)

简介: 带你读《2022技术人的百宝黑皮书》——stream的实用方法和注意事项(1)

stream的实用方法和注意事项


image.pngimage.png作者:袁俊子(圆镜) 出品:大淘宝技术

 

 

相信大家一定都在项目开发中享受过stream带来的便利性和优雅的代码风格。接下来补充几个项目中不常见到但是同样实用的api,同时跟大家一起探讨stream这把双刃剑的另一面。

 

使用但不常见的方法

 

filter、map、skip等方法想必大家都十分熟悉 无需赘述。这里仅介绍工程中使用较少但同样实用的方法。

 

reduce

 

reduce有3个参数:初始值、累加器、组合器。下面通过几个case为大家逐一讲解。由于比较绕,下面贴上ide执行结果

 

image.png

 

 

 

当顺序读流或者累加器的参数和它的实现的类型匹配时,我们不需要使用组合器。通常只有在处理对象属性时则需要组合器来帮助编译器推断入参类型。实际在串行流中组合器并不会实际执行,只需要出入参类型满足编译器推断要求即可。可以看到上方result3的计算,末尾组合器适用max还是min 结果是一样的。

 

allMatch/anyMatch/noneMatch

 

判断集合中是否 全部都匹配/存在任意匹配/不存在匹配 某一规则。

 


比如下面一段代码,判断集合中的对象是否全部合法。语义十分简单。下面对比stream写法和常规写法。两种写法的运行结果是一样的。

 

@Data @AllArgsConstructor
public static class Calendar { private LocalDate date; private boolean today; private boolean signed;
}
//日历初始化
LocalDate now = new LocalDate(); List<Calendar> calendars = Arrays.asList(
new Calendar(new LocalDate(1661174238000L), false, false)
, new Calendar(new LocalDate(1661828371000L), false, false)
, new Calendar(new LocalDate(1661433438000L), false,  false)
, new Calendar(new LocalDate(1661519838000L), false,  false)
, new Calendar(new LocalDate(1661779038000L), false,  false)
, new Calendar(now, true, true)
);
//判断昨天是否签到过。写法一
boolean yesterdaySigned = calendars.stream()
.anyMatch(
t -> Days.daysBetween(t.getDate(), now).getDays() == 1 && t.isSigned()
);
System.out.println("昨天是否签到过 -> " + yesterdaySigned);
//写法二
boolean yesterdaySigned2 = false; for (Calendar calendar : calendars) {
if (Days.daysBetween(calendar.getDate(), now).getDays() == 1) {
//找到昨天的日历,并判断是否签到
yesterdaySigned2 = calendar.isSigned();
break;
}
}
System.out.println("昨天是否签到过写法二 -> " + yesterdaySigned2);

 

 

 

这里写法一虽然更简练但是存在问题,大家有看出来的吗。这个问题放在“注意事项”中专门讲解。

 

带你读《2022技术人的百宝黑皮书》——stream的实用方法和注意事项(2)https://developer.aliyun.com/article/1339661?groupCode=taobaotech

相关文章
|
人工智能 搜索推荐 安全
GPT Prompt编写的艺术:如何提高AI模型的表现力
GPT Prompt编写的艺术:如何提高AI模型的表现力
710 0
|
存储 设计模式 算法
DDD之于业务支撑的意义
DDD之于业务支撑的意义
393 0
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
290 6
|
敏捷开发 存储 安全
潜力与限制:低代码开发平台优缺点全面分析
低代码开发平台加速企业数字化转型,优点包括快速开发、降低技术门槛、灵活定制和方便维护。然而,也存在复杂功能限制、数据孤岛、供应商依赖和安全合规问题。推荐的低代码平台有Zoho Creator(适合中小企业)、Mendix(创新型企业)、Microsoft Power Apps(大型企业)、OutSystems(高安全合规要求)以及AppSheet和Appian(入门级用户)。在选择时,需综合考虑业务需求、技术因素和风险。
1534 0
|
10月前
|
数据格式
Modbus协议详解:RTU帧与ASCII帧的差错校验
总的来说,RTU和ASCII各有优势,选择哪种方式取决于具体的应用需求。如果需要高效的数据传输和强大的错误检测能力,可能会选择RTU。如果需要易于理解的数据表示和简单的错误检测方式,可能会选择ASCII。
510 14
|
Java 编译器 API
带你了解“Java新特性——模块化”
带你了解“Java新特性——模块化”
600 11
|
存储 架构师 测试技术
架构之道:人人都是架构师(2)
每个业务系统的开发者都应该具备一定的架构师素养,架构师的重要职责不仅仅是做决策,更重要的是提升团队的整体能力。一个好的架构师应该聚焦于业务和系统,定义问题和结果,设计系统、模块和代码,同时也需要解决跨域问题,确定团队间的边界,制定规范,统一语言,并创建一个让每个人都能成长为架构师的环境,以促进团队的敏捷性。本文旨在探讨如何培养架构思维,并阐述了架构师的职责、能力模型、方法论,以及如何成为架构师。
457 10
|
安全 IDE Java
MapStruct-JavaBean映射工具使用指南
MapStruct-JavaBean映射工具使用指南
314 9
|
存储 运维 架构师
架构之道:人人都是架构师(1)
架构之道:人人都是架构师
645 8
|
XML Java 程序员
Java的基础入门(1)
Java的基础入门
289 7