首页 > 解决方案 > Scala:如何在 map/foreach 迭代之间等待?

问题描述

我现在卡住了,答案可能在谷歌的某个地方,但我不知道这次该用什么词,所以我希望有人能在这里帮助我。

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

我现在有类似的东西:

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

但我认为这不是正确的做法。也许有一种方法不会阻止一切?

标签: scalaforeachwaitsleep

解决方案


在 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 未来的话题 - Scala - ScheduledFuture

借助这种方法,您可以编写我上面介绍的相同逻辑:

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

type ResultType = Unit

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

推荐阅读