在 Kotlin 中参与一个序列

Take part of a sequence in Kotlin

我试图在 Kotlin 中部分使用一个序列,以便将其拆分。

fun main() {
    val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
    println(seq.take(4).toList().toString());
    println(seq.toList().toString())
}

这输出:

[0, 1, 2, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 90]

但我追求的是:

[0, 1, 2, 3]
[4, 5, 6, 7, 8, 90]

制作列表仅用于演示目的。因此,创建整个序列的列表并拆分列表并不是我想要的答案。

迭代器有asSequence()函数,但是returns序列只能迭代一次。重点是每次迭代都使用相同的迭代器。

// I don't know how to name the function...
public fun <T> Iterable<T>.asIteratorSequence(): Sequence<T> {
    val iterator = this.iterator()
    return Sequence { iterator }
}

fun main() {
    val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asIteratorSequence()

    println(seq.take(4).toList().toString()) // [0, 1, 2, 3]
    println(seq.toList().toString()) // [4, 5, 6, 7, 8, 9]
    println(seq.toList().toString()) // []
}

您可以从原始序列创建两个子序列:

    val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence()
    val firstCount = 4
    val first = seq.take(firstCount)
    val second = seq.drop(firstCount)

    println(first.toList())
    println(second.toList())

我发现我们可以为此使用迭代器:

fun main() {
    val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).asSequence().iterator()
    println(seq.asSequence().take(4).toList().toString());
    println(seq.asSequence().toList().toString())
}

这样序列推进内部迭代器。如果序列最初是从一个Iterable中得到的,就像上面的例子,我们可以进一步简化:

fun main() {
    val seq = listOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9).iterator()
    println(seq.asSequence().take(4).toList().toString());
    println(seq.asSequence().toList().toString())
}