我写了以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
for (i in src)
{
if (i % 2 == 0) dest.add(Math.sqrt(i.toDouble()))
}
在我的情况下,IntellJ(或者是Android Studio)询问我是否想要使用stdlib中的操作替换for循环。这将导致以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
src.filter { it % 2 == 0 }
.mapTo(dest) { Math.sqrt(it.toDouble()) }
我必须说,我喜欢修改后的代码。在类似情况下,与for循环相比,我发现它更容易编写。然而,当我阅读filter
函数的作用时,我意识到这段代码比for循环慢得多。 filter
函数创建一个新列表,其中仅包含与谓词匹配的src元素。因此,在stdlib版本的代码中产生了一个额外的列表和一个额外的循环。当然,对于小型列表可能并不重要,但一般来说,这听起来不像是一个好的选择。特别是如果应该像这样链接更多的方法,您将会获得许多可以通过编写for循环避免的附加循环。
我的问题是Kotlin中什么被认为是良好实践。我应该坚持使用for循环,还是我错过了什么,它的工作方式与我所想象的不同?