是否有标准的 Kotlin 函数用于将 Sequence 拆分为头部和尾部?

Dun*_*gor 5 kotlin

我正在考虑带有签名的东西,例如fun <T> Sequence<T>.destruct(): Pair<T, Sequence<T>>? 它将返回null一个空序列,否则接收器的第一个和其余部分。

Ben*_* P. 6

我相信答案是“不”。此页面列出了所有标准Sequence功能,搜索“pair”并不会找到与您想要的匹配的任何内容。

也就是说,有一个标准firstOrNull()函数和一个drop()函数,所以你可以很容易地编写自己的函数:

fun <T> Sequence<T>.destruct() =
    firstOrNull()?.let { it to drop(1) }
Run Code Online (Sandbox Code Playgroud)

如果您正在使用只能使用一次的序列,则上述方法将不起作用(因为两者firstOrNull()和(最终)DropSequence都会调用接收器的iterator()方法)。您可以通过遵循相同的一般思想但更明确地说明如何iterator()调用来解决此问题:

fun <T> Sequence<T>.destruct(): Pair<T, Sequence<T>>? {
    val iterator = iterator()
    
    return if (iterator.hasNext()) {
        iterator.next() to iterator.asSequence()
    } else {
        null
    }
}
Run Code Online (Sandbox Code Playgroud)