斯卡拉 - 未来名单首先完成了条件

时间:2016-03-12 18:00:01

标签: list scala conditional-statements future

我有一份期货清单,我希望第一个完成一定的条件。 以下是可能代码的示例:

val futureList: Future[List[T]] = l map (c => c.functionWithFuture())
val data = for {
           c <- futureList
           }yield c
data onSuccess {
  case x => (x filter (d=> d.condition)).head
}

但它效率不高,因为我只会选择列表中的一个元素,但会计算所有这些元素的延迟时间。

我知道firstCompletedOf,但这不是我正在搜索的内容。

(抱歉我的英语不好。)

1 个答案:

答案 0 :(得分:2)

一旦满足条件的未来完成,请尝试使用Promise并在其上调用trySuccess。第一个调用trySuccess将完成未来,以下的调用将无效(与调用success相反,Promise只能在import scala.concurrent.{ Await, Future, Promise } import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global import scala.util.Random def condition(x: Int) = x > 50 val futures = (1 to 10) map (x => Future { // wait a random number of ms between 0 and 1000 Thread.sleep(Random.nextInt(1000)) // return a random number < 100 Random.nextInt(100) }) val p = Promise[Int]() // the first one that satisfies the condition completes the promise futures foreach { _ filter condition foreach p.trySuccess } val result = p.future // Watch out: the promise could never be fulfilled if all the futures are <=50 println("The first completed future that satisfies x>50 is: " + Await.result(result, 10.seconds)) 上调用一次。)

请注意,如果列表中的未来不满足条件,您永远不会有结果,即承诺未来永远不会完成。

RUN rm -frv /usr/share/nginx/html/*
RUN ls /usr/share/nginx/html/