Scala:如何在map / foreach迭代之间等待?

问题描述

我目前陷入困境,答案可能在Google上的某个地方,但这次我不知道使用什么词,所以我希望有人能在这里为我提供帮助。

我有一个元素列表,我想对每个元素应用功能,但是我想在每个元素之间等待。

我现在有类似的东西:

  val numbers = List(10,11,12,13,14)
  numbers.foreach(i => {
    //do some stuff with i
    Thread.sleep(1000)
  })

但是我认为这不是正确的方法。也许有一种方法可以不阻止所有内容?

解决方法

在JVM上的纯Scala中,您可以使用Java的ScheduledExecutorService

val list: List[Int] = List(1,2,3)

private val es: ScheduledExecutorService = Executors.newScheduledThreadPool(1)

type ResultType = Unit

val futures: Seq[ScheduledFuture[ResultType]] = list.zipWithIndex.map { case (integer,index) =>
  val runnable: Callable[ResultType] = () => println(integer)
  es.schedule(runnable,index*1,duration.SECONDS)
}

实际上有一个关于计划的Scala Future的主题-Scala - ScheduledFuture

借助this approach,您可以编写与我上面介绍的相同的逻辑:

val list: List[Int] = List(1,3)

type ResultType = Unit

val futures: Seq[Future[ResultType]] = list.zipWithIndex.map { case (integer,index) =>
  DelayedFuture(index * 1.seconds)(println(integer))
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...