什么时候“for循环”变成了大罪?


我是个老家伙,在一个由年轻人组成的新团队里工作,而年轻人是负责人。

事实证明,现在使用 for 循环是非常可怕、非常讨厌的事情,必须不惜一切代价避免。

一切都必须是流和映射

如果你能用一条跨行的巨大语句写出你的代码块,就会得到加分。

但是......罗马不是一天建成的。

这是什么时候发生的?为什么会这样?

网友讨论:

比较 for 循环和 while 循环:

while 循环仍然有它的用武之地,但 for 循环是一个很好的、可读性很强的成语,它能帮助我(略微)更快地阅读和理解循环,而不是写成 while 循环。因此,我们引入了 for 作为一种简写,将循环逻辑集中在同一行,而将重复任务集中在正文中。而 while 则将这两部分的逻辑混杂在一起。

因此,while 循环仍然有用,但 for 更受欢迎。

现在,for 循环甚至还有不同的习语--对集合进行映射,或对集合进行过滤,或只是强制性地对每个项目进行操作。这些可能占所有 for 循环的 90%。项的索引其实并不是任务的一部分。

因此,map、filter、fold 和 foreach 都是特定常见任务的惯用语,当我看到这些词时,我会更快地理解代码在做什么(而且,也不用检查其循环逻辑是否有错误)。

流式构词法(streams-idiom )是对上述构词法的概括,让读者一看就知道他们是在处理一个集合,并对单个条目执行一系列任务。尤其是,任务并不依赖于连续的项目对,也不依赖于项目的索引。因此,当我开始阅读流操作管道时,我就知道了这一切,这简化了我在理解和/或调试此类代码时需要思考的问题。

因此,这或许能帮助人们平和地对待 "流 "和 fors 以及 while之间的关系。

==============================================

对集合进行迭代的函数式风格大肆宣传的主要原因是,您可以避免未知的副作用,因为在传统迭代时您无法访问其他任何内容,从而在代码库中造成未知的影响。

如果您尝试做更复杂的事情,您还可以避免 for 循环内的 for 循环以及奇怪的嵌套继续和中断

如果嵌套循环变成“内循环函数”,其中外循环是标准流操作(映射、过滤器等),那么突然可以对内循环进行单元测试。

================================================
用对象流和这些流上的操作来表达大多数计算有一些优点——使用不可变的数据结构变得更容易,不鼓励副作用,一些错误在类型级别变得明显,从而在构建时可以检测到。
在过去的十年里,这已经慢慢进入主流思维。
肯定有优点(也有一些缺点,包括运行时开销),我认为你的问题可能是年轻人能够推广这种方法,但无法阐明为什么事情是这样的。

================================================
流非常适合将许多简单的操作链接在一起,同时保持逻辑平坦。

如果您需要在集合上执行过滤、映射、还原、分组、排序、查找、平面地图、压缩......等操作,流可以帮助您实现这些操作,因为它提供了一种既定的、经过测试的方法,从而降低了出现错误的风险,并减轻了您每次都要考虑如何完成这项任务的心理负担。它还会让你减少到处使用副作用的可能性,更喜欢不可变的数据结构而不是可变的数据结构。

如果你需要在一个地方进行大量的 IO、异常检查和复杂的领域逻辑,而你又不想将它们分离到不同的方法/类中,那么使用 for 循环可能会更好,因为没有通用的功能可以处理这些问题。

我两种方法都用过,但在合理的情况下尽量使用流,因为它通常会让代码更简洁,更容易理解,因为每个操作之前都有可识别的单词。