如果编写以下代码:
fun main(args: Array<String>) {
val letters = listOf("a", "b", "c", "d")
letters.map { print(it); it }.forEach { print(it) }
}
我得到以下输出: abcdabcd
但是,如果我改为将其改为序列:
fun main(args: Array<String>) {
val letters = listOf("a", "b", "c", "d")
letters.asSequence().map { print(it); it }.forEach { print(it) }
}
我得到以下内容: aabbccdd
看来Kotlin的序列并不能保证“组操作”(例如map
或forEach
)在另一个开始之前完成,但是当我们将这些操作应用于集合时,可以保证这些操作一次可以完成。
在开始执行下一个链接的“组操作”之前,我们如何保证“组操作”(例如map
或)forEach
将应用于集合或序列中的所有元素?
我们如何保证在开始执行下一个链接的“组操作”之前,将诸如map或forEach之类的“组操作”应用于集合或序列中的所有元素?
行为取决于输入是aCollection
还是a Sequence
。
"abcd"
一次"abcd"
又一次看到的原因。"aa"
,然后"bb"
等等。要了解的主要是Kotlin序列是惰性的。每当转换Sequence
(例如通过map
或其他函数)时,该转换也将延迟应用。只有在您实际评估序列中的元素时(在您的情况下,这是通过进行的forEach
),才应用转换。
如果您需要的Collection
行为Sequence
,则必须首先将序列转换为集合。您可以调用sequence.toList()
它,也可以对其进行变换,但是无法立即获得“渴望的”行为Sequence
。
让我们看一下两种不同的情况。
letters
是List<String>
列表不是很懒。为了map
一个List
到另一个,我们必须通过整个输入列表走路,变换每个元素,并构建输出列表。考虑到这一点...
第一个操作,map { print(it); it }
从输入中读取每个值,将其打印并创建一个新列表。它返回一个保存的列表"a", "b", "c", "d"
,程序已打印"abcd"
。
第二个操作forEach { print(it) }
遍历列表并打印每个元素。完成此操作后,程序将"abcd"
再次打印,总输出为"abcdabcd"
。
letters
是Sequence<String>
序列是惰性的。为了map
一个Sequence
到另一个,该计划保留了变换方法和等待,直到别人进行改造前实际需要的值。所以...
第一个操作将创建一个TransformingSequence
同时包含原始序列和print(it); return it
转换器的新对象。它返回这个新序列,程序尚未打印任何内容。
第二个操作是“终止”(即它实际上是评估序列中的每个元素)。遍历序列并打印每个元素。但是请记住:我们要遍历的序列是一个TransformingSequence
本身会打印每个元素的序列!因此,调用中的第一个print
动作forEach
打印出来"aa"
,第二个动作打印出来"bb"
,依此类推,总输出为"aabbccdd"
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句