Scala - 未来列表首先完成,有条件



我有一个期货列表,我想在某个条件下完成第一个。下面是一个可能的代码示例:

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但这不是我要搜索的。

(对不起,我的英语不好。

尝试使用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))

最新更新