我有一些副作用功能,
def f(): Future[Int] = {
val n = Random.nextInt()
println(s"Generated $n")
Future(n)
}
我想重复执行它,直到谓词返回 true。
def success(n: Int): Boolean = n % 2 == 0
我的计划是建立Stream
结果
val s = Stream.fill(10)(f)
然后使用Future.find
得到第一个满足谓词的结果。
Future.find(s)(success) map println
问题是Future.find
并行运行所有 future,我希望它一个接一个地依次执行 future,直到谓词返回 true。
scala> Future.find(s)(success) map println
Generated -237492703
Generated -935476293
Generated -1155819556
Generated -375506595
Generated -912504491
Generated -1307379057
Generated -1522265611
Generated 1163971151
Generated -516152076
res8: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@37d28f02
Some(-1155819556)
问题是如何顺序执行 future 流直到谓词返回 true?标准或第三方库中有合适的函数吗?
我建议使用另一种方法,而不是使用 Stream。递归地使用 Future 的过滤器和recoverWith:
def findFirst[A](futureGen: => Future[A], predicate: A => Boolean): Future[A] = {
futureGen.filter(predicate).recoverWith { case _ => findFirst(futureGen, predicate) }
}
findFirst(f, success)
这将依次调用 Future,直到“成功”返回 true。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)