首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >toList()、.take(10)和take(10).toList()在kotlin中的差异

toList()、.take(10)和take(10).toList()在kotlin中的差异
EN

Stack Overflow用户
提问于 2018-02-07 12:37:36
回答 4查看 263关注 0票数 2

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

代码语言:javascript
复制
fun main(args: Array<String>) {
    val generatePrimeFrom2 = generateSequence(3){ it + 2 }
    print(generatePrimeFrom2.toList().take(10))
}

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

这段代码对我来说很好:

代码语言:javascript
复制
fun main(args: Array<String>) {
    val generatePrimeFrom2 = generateSequence(3){ it + 2 }
    print(generatePrimeFrom2.take(10).toList())
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-07 12:40:56

这是提示-> generate infinite list。在第一个解决方案中,您首先要创建一个列表(等待无穷大),然后使用前10个元素。

在第二个片段中,从无限列表中只获取前10个元素并将其更改为list

票数 5
EN

Stack Overflow用户

发布于 2018-02-07 12:45:38

generateSequence函数生成一个序列,该序列要么是无限的,要么是在lambda传递给它返回null时结束。在您的示例中,是{ it + 2 },它从不返回null,因此序列是无限的。

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

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

如果您检查一下关于Sequence<T>Iterable<T>(link)之间的差异的问题,可能会变得更清楚。

票数 8
EN

Stack Overflow用户

发布于 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必须有实际值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48664024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档