坏味006:何时for-loop,何时forEach
#Smell #Java #Collection #CodeStyle #Iterator
1.目标:集合遍历怎么才香
自从Java8增加了StreamApi开始,关于集合的遍历就乱套了。 看官根据自己的经验和习惯,闻闻以下代码的味道,怎么使之香。
图①:心里有锤子,看啥都是钉(有则复制)
图②:手里有锤子,看啥都想锤(过滤元素)
图③:心里有钉子,就会想锤子(类型转换)
2.重构:性能控的同事
实际上,StreamApi的forEach,比for循环有20%的性能损失。 在非stream+lambda语句块,推荐for循环,优先性能和可读性。
图④:重构图①,使用addAll(有时new All)
图⑤:重构图②,使用for循环和isEmpty(其他Empty工具方法)
图⑥:重构图③,使用for循环(for-iter语法糖)
3.重构:函数控的同事
Java的函数式能力很弱,其可读性不好。在非大规模过滤,转换,分组,聚合的数据处理情景下,不推荐StreamApi。
注意,重构不可改变原语义,不可以不判定empty而直接return stream
图⑦:重构图②,stream + filter(StreamApi可自动变循环)
图⑧:重构图③,strem + map(java的labmda不香)
4.迭代:怎么用Iterator
在某些场景下,必须使用Java中的iterator()
,如集合自身的可变操作时。
图⑨:集合本身有变化,条件remove
因为洁癖,附图只想编号到⑨,所有就不截图举例了。
5.总结:可读性和性能优先
在通常情况下,可读性优先,因为安迪比尔定律
,你懂的。
以下情况,性能优先,
- 性能是第一指标
- 调用频率非常高
- 可读性差不多时
函数式的前提是没有副作用,以下常见SideEffect
- mutable
- excetpion
- logging
所以,勤动脑,勤洗手。脑子不好使,戴啥口罩都白瞎。
–
※ 我们的征途是星辰大海 ※
题图:Astronomy Picture of the Day, Discover the cosmos!