gpt4 book ai didi

kotlin - Kotlin 中 toList().take(10) 和 take(10).toList() 之间的区别

转载 作者:行者123 更新时间:2023-12-02 05:32:34 27 4
gpt4 key购买 nike

我只是在尝试新的 kotlin 语言。我遇到了生成无限列表的序列。我生成了一个序列并尝试打印前 10 个元素。但是下面的代码没有打印任何东西:

fun main(args: Array<String>) {
val generatePrimeFrom2 = generateSequence(3){ it + 2 }
print(generatePrimeFrom2.toList().take(10))
}

但是当我在 print 语句中更改 take(10).toList() 时,它工作正常。为什么会这样?

这段代码对我来说效果很好:

fun main(args: Array<String>) {
val generatePrimeFrom2 = generateSequence(3){ it + 2 }
print(generatePrimeFrom2.take(10).toList())
}

最佳答案

generateSequence 函数生成一个序列,该序列要么是无限的,要么在传递给它的 lambda 返回时结束 null .在您的情况下,它是 { it + 2 } ,永远不会返回 null , 所以序列是无限的。

当您调用 .toList() 时在序列上,它将尝试收集所有序列元素,因此如果序列是无限的(除非索引溢出或发生内存不足错误),它将永远不会停止,因此它不会打印任何内容,因为它没有完成。

相反,在第二种情况下,您使用 .take(10) 限制了序列中的元素数量。 尝试收集它的元素之前。然后 .toList()调用简单地收集 10 个项目并完成。

如果您查看此关于 Sequence<T> 之间差异的问答,可能会更加清楚和 Iterable<T> : (link)

关于kotlin - Kotlin 中 toList().take(10) 和 take(10).toList() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48664024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com