【问题标题】:Scala : How to wait between map/foreach iteration?Scala:如何在 map/foreach 迭代之间等待?
【发布时间】:2020-08-22 05:38:55
【问题描述】:

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

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

我现在有类似的东西:

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

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

【问题讨论】:

  • 为什么要在每个元素之间等待?如果这个函数正在做一些繁重的事情,比如调用外部服务或类似的事情,那么最好使用更合适的并发抽象,例如流 (fs2, AkkaStream, Monix Observables, @ 987654325@)

标签: scala foreach wait sleep


【解决方案1】:

在 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,2,3)

type ResultType = Unit

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

【讨论】:

  • index secondsindex * 1.seconds 简单
  • 非常感谢,比我想象的更简单
猜你喜欢
  • 2011-09-15
  • 2014-07-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多