首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“加窗”的结果不同?

为什么“加窗”的结果不同?
EN

Stack Overflow用户
提问于 2021-07-16 21:32:58
回答 1查看 162关注 0票数 0

带有列表的代码:

代码语言:javascript
复制
println(listOf(1, 2, 3).windowed(1))
println(listOf(1, 2, 3).windowed(1) { it })
println(listOf(1, 2, 3).windowed(1) { it.toList() })

结果:

代码语言:javascript
复制
[[1], [2], [3]]
[[3], [3], [3]]  //why is there 3 everywhere?
[[1], [2], [3]]

具有顺序的代码:

代码语言:javascript
复制
println(sequenceOf(1, 2, 3).windowed(1).toList())
println(sequenceOf(1, 2, 3).windowed(1) { it }.toList())
println(sequenceOf(1, 2, 3).windowed(1) { it.toList() }.toList())

结果:

代码语言:javascript
复制
[[1], [2], [3]]
[[], [], []]     //why?!
[[1], [2], [3]]

请解释一下

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-16 22:42:41

它载于该职能的文件:

注意,传递给转换函数的列表是短暂的,仅在该函数中有效。您不应该存储它或允许它以某种方式逃逸,除非您对它做了快照。

作为实现细节,这个高阶函数对窗口的每个元素重用相同的list实例,并在两者之间清除/填充它。这就避免了分配许多列表。

通过将它作为transform函数的返回值传递,您将允许list实例转义,因为它们警告您不要这样做。

在第三个示例中,您使用toList()返回列表的副本,因此它正确工作。

在对序列执行此操作时,结果是不同的,因为函数内部处理列表和其他可迭代类型的方式不同。也许算法在末尾清空重复使用的列表。

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

https://stackoverflow.com/questions/68415452

复制
相关文章

相似问题

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