带有列表的代码:
println(listOf(1, 2, 3).windowed(1))
println(listOf(1, 2, 3).windowed(1) { it })
println(listOf(1, 2, 3).windowed(1) { it.toList() })结果:
[[1], [2], [3]]
[[3], [3], [3]] //why is there 3 everywhere?
[[1], [2], [3]]具有顺序的代码:
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())结果:
[[1], [2], [3]]
[[], [], []] //why?!
[[1], [2], [3]]请解释一下
发布于 2021-07-16 22:42:41
它载于该职能的文件:
注意,传递给转换函数的列表是短暂的,仅在该函数中有效。您不应该存储它或允许它以某种方式逃逸,除非您对它做了快照。
作为实现细节,这个高阶函数对窗口的每个元素重用相同的list实例,并在两者之间清除/填充它。这就避免了分配许多列表。
通过将它作为transform函数的返回值传递,您将允许list实例转义,因为它们警告您不要这样做。
在第三个示例中,您使用toList()返回列表的副本,因此它正确工作。
在对序列执行此操作时,结果是不同的,因为函数内部处理列表和其他可迭代类型的方式不同。也许算法在末尾清空重复使用的列表。
https://stackoverflow.com/questions/68415452
复制相似问题