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

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

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

打印观察执行次数如下

 

 

 

image.png

 

 

anyMatch 会无条件遍历所有元素再返回,而直观的遍历写法往往不会犯这种错误,拿到结果后可以提前break。大家可能会想到先利用filter过滤获获取“昨天”的日历,然后再anymatch

boolean yesterdaySigned = calendars.stream()
.filter(t -> Days.daysBetween(t.getDate(), now).getDays() == 1)
.anyMatch(Calendar::isSigned);

 

 

 

但是很可惜,filter同样会完整遍历整个集合。事实上遍观所有stream方法似乎都没有办法很好的解决这个问题。也欢迎大家一起探讨。

 

image.png可阅读性

摘取了某业务中判断周期内签到次数的方法,采用stream和for循环常规写法

private int getCycleActionCount(Date start, Date end, List<ActionCalendar> calendar) { int count = 0;
for (ActionCalendar calendarDay : calendar) { Date date = calendarDay.getDate();
if (date.after(start) && date.before(end) && calendarDay.isComplete()) {
//在周期内任意一天签到,签到次数自增。count++;
}
}
return count;
}
private int getCycleActionCount2(Date start, Date end, List<ActionCalendar> calendar) {


14

 

return Math.toIntExact(

15

 

calendar.stream()

16

 

.filter(

17

 

//统计周期内签到天数

18

 

t -> (

19

 

t.getDate().after(start) && t.getDate().before(end) && t.isComplete()

20

 

)

21

 

).count()

22

 

);

23

}

 

 

 

这样看两者之间 光从可阅读性上看并没有特别大的区分度。而即使熟练的stream 爱好者,相信写出一段stream代码后也会多看几眼确认性能、缩进是否达到最优。可见在某些场景下无论性能、可读性还是书写便利性都不占优, 此时stream似乎就不是最优选择了。

 

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

 

相关文章
|
消息中间件 缓存 监控
避免分布式事务
避免分布式事务
|
安全 网络安全 开发者
OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问
OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问
|
域名解析 缓存 运维
函数计算产品使用问题之添加了环境变量SD_DOMAIN,但sd的页面仍然无法正常显示,是什么导致的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
Windows
Windows——添加右键菜单选项
Windows——添加右键菜单选项
226 0
|
分布式计算 大数据 Java
MaxCompute产品使用合集之如何通过Java SDK下载
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
前端开发 Java 应用服务中间件
Spring MVC框架:第十四章:数据校验
Spring MVC框架:第十四章:数据校验
186 0
Spring MVC框架:第十四章:数据校验
|
前端开发 Ruby
Tk库的使用(1)
# # To change this template, choose Tools | Templates# and open the template in the editor. # Sample code from Programing Ruby, page 248require 'tk'cl...
1224 1
|
安全 网络安全 云计算
|
机器学习/深度学习 人工智能 自然语言处理
2016年,机器学习和人工智能领域有什么重大进展?(附重要论文下载链接)
2016年机器学习领域取得了很多可以铭记在历史中的进展,将其称为”机器学习元年”也并不为过。市场上各大公司都在进行机器学习的研究,即使没有,他们也通过收购各类机器学习初创公司来快速进入这个领域。
6496 0