星辰大海▼ 2020▼ Smell Java Collection CodeStyle Iterator

坏味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

所以,勤动脑,勤洗手。脑子不好使,戴啥口罩都白瞎。

※ 我们的征途是星辰大海 ※

《坏味006:何时for-loop,何时forEach》 自从Java8增加了StreamApi开始,关于集合的遍历就乱套了。 看官根据自己的经验和习惯,闻闻以下代码的
题图:Astronomy Picture of the Day, Discover the cosmos!