我只是在尝试新的kotlin语言。我遇到了产生无限列表的序列。我生成了一个序列,并尝试打印前10个元素。但是下面的代码没有打印任何内容:
fun main(args: Array<String>) {
val generatePrimeFrom2 = generateSequence(3){ it + 2 }
print(generatePrimeFrom2.toList().take(10))
}但是,当我在take(10).toList()语句中更改print时,它工作得很好。为什么会这样呢?
这段代码对我来说很好:
fun main(args: Array<String>) {
val generatePrimeFrom2 = generateSequence(3){ it + 2 }
print(generatePrimeFrom2.take(10).toList())
}发布于 2018-02-07 12:40:56
这是提示-> generate infinite list。在第一个解决方案中,您首先要创建一个列表(等待无穷大),然后使用前10个元素。
在第二个片段中,从无限列表中只获取前10个元素并将其更改为list
发布于 2018-02-07 12:45:38
generateSequence函数生成一个序列,该序列要么是无限的,要么是在lambda传递给它返回null时结束。在您的示例中,是{ it + 2 },它从不返回null,因此序列是无限的。
当您对序列调用.toList()时,它将尝试收集所有序列元素,因此,如果序列是无限的(除非索引溢出或内存不足错误发生),它将永远不会停止,因此它不会打印任何内容,因为它没有完成。
在第二种情况下,相反,在尝试收集其项之前,可以使用.take(10)限制序列中元素的数量。然后,.toList()调用简单地收集这10项并完成。
如果您检查一下关于Sequence<T>和Iterable<T>:(link)之间的差异的问题,可能会变得更清楚。
发布于 2018-02-07 12:42:09
generatePrimeFrom2.toList()试图计算/创建一个无限长的列表。
然后,generatePrimeFrom2.toList().take(10)从无限长列表中获取前10个元素。
它不打印,因为它正在计算无限长的列表。
然而,generatePrimeFrom2.take(10)只尝试计算前10个元素。generatePrimeFrom2.take(10).toList()将前10个元素转换为列表。
你知道,generateSequence(3){ it + 2 }没有终点。所以它有无限长。
Sequences没有实际值,在需要时计算,但是Lists必须有实际值。
https://stackoverflow.com/questions/48664024
复制相似问题