在Kotlin中的数组中添加asSequence()的优势

dev*_*oid 4 sequence kotlin

任何人都可以帮助我指出以下代码中使用asSequence()的区别。

val numbers = 1 .. 50
    val output = numbers.filter{ it < 10 }.map{ Pair("Kotlin", it)}
    output.forEach(::println)
Run Code Online (Sandbox Code Playgroud)

新增中 asSequence()

val numbers = 1 .. 50
val output = numbers.asSequence().filter{ it < 10 }.map{ Pair("Kotlin", it)}
output.forEach(::println)
Run Code Online (Sandbox Code Playgroud)

Ada*_*old 5

区别在于,当您使用a时Sequence,仅当您遍历元素时它才会运行函数。因此,例如:

val numbers = 1 .. 50
val output = numbers.asSequence().filter{
    println("Filtering $it")
    it < 10
}.map{
    println("Mapping $it")
    Pair("Kotlin", it)
}
Run Code Online (Sandbox Code Playgroud)

不会打印任何内容,因为您没有进行遍历output

检查文档有帮助:

/**
 * Creates a [Sequence] instance that wraps the original collection
 * returning its elements when being iterated.
 */
public fun <T> Iterable<T>.asSequence(): Sequence<T> {
    return Sequence { this.iterator() }
}
Run Code Online (Sandbox Code Playgroud)

使用Sequences很有用,因为如果仅调用mapa Collection,结果将转换为a,List而使用a Sequence则可以避免这些转换步骤。想想Sequence就像StreamS中的Java流API中(不同之处在于科特林的解决方案不支持并行执行)。