Kotlin-确保在开始下一个操作之前完成收集操作

若昂·内维斯

如果编写以下代码:

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的序列并不能保证“组操作”(例如mapforEach)在另一个开始之前完成,但是当我们将这些操作应用于集合时,可以保证这些操作一次可以完成。

在开始执行下一个链接的“组操作”之前,我们如何保证“组操作”(例如map或)forEach将应用于集合或序列中的所有元素?

我是

我们如何保证在开始执行下一个链接的“组操作”之前,将诸如map或forEach之类的“组操作”应用于集合或序列中的所有元素?

行为取决于输入是aCollection还是a Sequence

  • 集合将对集合中的每个元素应用链中的单个操作,然后再应用链中的下一个操作。这就是为什么您"abcd"一次"abcd"又一次看到的原因
  • 在将所有操作应用于序列中的下一个元素之前,序列会将链中的每个操作应用于序列中的每个元素。这就是为什么您看到"aa",然后"bb"等等。

要了解的主要是Kotlin序列是惰性的每当转换Sequence(例如通过map或其他函数)时,该转换将延迟应用。只有在您实际评估序列中的元素时(在您的情况下,这是通过进行的forEach),才应用转换。

如果您需要的Collection行为Sequence,则必须首先将序列转换为集合。您可以调用sequence.toList()它,也可以对其进行变换,但是无法立即获得“渴望的”行为Sequence


让我们看一下两种不同的情况。

什么时候lettersList<String>

列表不是很懒。为了map一个List到另一个,我们必须通过整个输入列表走路,变换每个元素,并构建输出列表。考虑到这一点...

第一个操作,map { print(it); it }从输入中读取每个值,将其打印并创建一个新列表。它返回一个保存的列表"a", "b", "c", "d",程序已打印"abcd"

第二个操作forEach { print(it) }遍历列表并打印每个元素。完成此操作后,程序将"abcd"再次打印,总输出为"abcdabcd"

什么时候lettersSequence<String>

序列是惰性的。为了map一个Sequence到另一个,该计划保留了变换方法和等待,直到别人进行改造前实际需要的值。所以...

第一个操作将创建一个TransformingSequence同时包含原始序列和print(it); return it转换器的新对象。它返回这个新序列,程序尚未打印任何内容。

第二个操作是“终止”(即它实际上是评估序列中的每个元素)。遍历序列并打印每个元素。但是请记住:我们要遍历的序列是一个TransformingSequence本身会打印每个元素的序列因此,调用中的第一个print动作forEach打印出来"aa",第二个动作打印出来"bb",依此类推,总输出为"aabbccdd"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Kotlin 在进入下一个索引之前等待 for 循环中的协程

Kotlin跳过for循环内的下一个迭代

在执行下一个操作之前,如何等待请求完成(Xcode 11)

如何在执行下一个史诗之前确保完成一个史诗?

Java流在完成上一个之前开始下一个映射

如何在执行下一个操作(获取)之前等待所有请求完成

确保forEach循环在下一个命令js之前完成

Kotlin-功能遍历集合获得当前/下一个价值

转到 android Kotlin 中的下一个活动;未解决的类引用

Android Kotlin 用 for 下一个循环替换 while

如何在Kotlin中压缩列表并跳过下一个?

Kotlin扩展,无需反射即可获得下一个Enum值

Kotlin多变量let,在下一个let中使用先前的变量

cron.daily是否会在开始下一个作业之前等待作业完成?

在 nodejs 中开始下一个循环之前,等待每个 for 循环迭代完成

如何在下一个功能开始之前等待功能完成?

在开始下一个动作之前等待动作完成

在将下一个都绑定到相同的onclick时,如何确保ajax调用的结果在开始下一个调用之前到达?

即使一个或多个操作引发异常,如何继续多个 Kotlin 协程异步操作?

创建k8s资源并等待其完成以继续下一个操作

等待请求完成,然后再执行下一个操作

为什么在ngUnsubscribe的“完成”之前“下一个”?

如何在执行下一个操作之前等待页面加载?

systemd在开始下一个服务单元之前不等待我的服务单元完成

在 Kotlin 之前

C# ef 第二个操作在上一个异步操作完成之前开始

Javascript-确保在执行下一个脚本之前执行一个脚本

Kotlin stdlib操作与for循环

Kotlin阵列操作