带你读《2022技术人的百宝黑皮书》——stream的实用方法和注意事项(3)https://developer.aliyun.com/article/1339660?groupCode=taobaotech
打印观察执行次数如下
显然 anyMatch 会无条件遍历所有元素再返回,而直观的遍历写法往往不会犯这种错误,拿到结果后可以提前break。大家可能会想到先利用filter过滤获获取“昨天”的日历,然后再anymatch
boolean yesterdaySigned = calendars.stream() .filter(t -> Days.daysBetween(t.getDate(), now).getDays() == 1) .anyMatch(Calendar::isSigned);
但是很可惜,filter同样会完整遍历整个集合。事实上遍观所有stream方法似乎都没有办法很好的解决这个问题。也欢迎大家一起探讨。
可阅读性
摘取了某业务中判断周期内签到次数的方法,采用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