我有一个期货列表,我想在某个条件下完成第一个。下面是一个可能的代码示例:
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))