Kotlin 参加科特林的一个序列

Kotlin 参加科特林的一个序列,kotlin,sequence,Kotlin,Sequence,我正在尝试部分使用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] 但我想要的是

我正在尝试部分使用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函数,但它返回的序列只能迭代一次。关键是对每个迭代使用相同的迭代器

// 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()) // []
}
迭代器有asSequence函数,但它返回的序列只能迭代一次。关键是对每个迭代使用相同的迭代器

// 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())

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

    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())
}

我发现我们可以使用迭代器来实现这一点:

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())
}

不是一个优雅的解决方案seq.withIndex.groupBy{it.index<4}{it.value}.Values不是一个优雅的解决方案seq.withIndex.groupBy{it.index<4}{it.value}.Values如果您已经开始使用列表/iterable,最好直接使用分区函数。为什么要创造sequence@sidgate使用列表进行演示。实际上,我使用的是一个XML解析器。如果您已经开始使用list/iterable,那么最好直接使用分区函数。为什么要创造sequence@sidgate使用列表进行演示。实际上,我使用的是XML解析器。