我有一个函数,可以计算两个子函数,如下所示。
def someFutureMethod1(input: Int): Int = {
input + 1
}
def someFutureMethod2(input: Int): Int = {
input + 12
}
def method1(sx: Int): Future[Int] = Future {
val future: Int = someFutureMethod1(sx)
val future2: Int = someFutureMethod2(future)
future.andThen{
return future
}
future2.andThen{
return future2
}
}
Print(method1(10))
expected result:
11
23我想在第一个函数计算时立即返回结果,并在第二个函数计算时更新或附加到相同的结果。
第二个函数依赖于第一个function.As,一旦第一个函数成功执行,就应该返回结果。并将第一函数结果传递给第二函数以计算第二函数。如果计算了第二个函数,则只返回第二个函数的结果。
有没有办法做到这一点?
提前感谢!!
发布于 2019-09-17 13:57:35
检查此代码片段(有函数签名修改),
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def someFutureMethod1(input: Int): Future[Int] = Future {
input + 1
}
def someFutureMethod2(input: Int): Future[Int] = Future {
input + 12
}
def method1(sx: Int): Future[Int] = {
val future1 = someFutureMethod1(sx)
val future2 = someFutureMethod2(sx)
for {
f1 <- future1
f2 <- future2
} yield {
f1 + f2 //add logic for your final output
}
}发布于 2019-09-17 17:04:11
好的,你可以这样做:
implicit val ec = Implicits.global
def someFutureMethod1(input: AtomicInteger): Unit = {
Future {
input.addAndGet(1)
println(input + " after method 1. And maybe also after method 2, because who knows.")
}
}
def someFutureMethod2(input: AtomicInteger): Unit = {
Future {
input.addAndGet(12)
println(input + " after method 2. And maybe also after method 1...")
}
}
val at = new AtomicInteger(1)
someFutureMethod1(at)
someFutureMethod2(at)
println(at + " at any point before or after the futures, so a pretty random value.")
Thread.sleep(1000)
println(at + " after all the futures. Probably.")我添加了所有println,这样代码就可以复制、粘贴和运行了。它会在你每次运行它时产生不同的输出,这应该是你运行和逃离的线索!
我不会在我管理的任何代码库中接受这个代码,我甚至不会接受它作为POC。这是完全不可预测的。基本上,method1和method2中的4条指令可以按任何顺序执行。
还要注意的是,它不能保证首先执行method1。
如果需要,您可以像这样更改代码,以确保在调用第二个方法之前解析第一个未来:
//Fluff removed
def someFutureMethod1(input: AtomicInteger): Future[Unit] = {
Future {
input.addAndGet(1)
}
}
def someFutureMethod2(input: AtomicInteger): Future[Unit] = {
Future {
input.addAndGet(12)
}
}
def theUglyMethod(at: AtomicInteger) = someFutureMethod1(at).map {_ =>
someFutureMethod2(at)
at
}再一次,请不要这样做!^^
https://stackoverflow.com/questions/57967833
复制相似问题