我想做这样的事情。
def foo(s : String): Future[Boolean] = Future {
val a = someLongRunningMethod
if(!a)
return false or throw some exception // what should i return
//do some more thing
val b= someMoreLongRunningMethod
if(b)
return true
return false
}
但无法使用boolean返回。我遇到了类型不匹配错误。
Error:(32, 12) type mismatch;
found : Boolean(false)
required: scala.concurrent.Future[Boolean]
return false
我是Scala的新手。我正在使用foo方法。我不确定这是否是使用它的最佳方式。请建议我应该如何实现它?
val r = foo("Nishant")
r.onComplete {
case Success(result) => {
//Do something with my list
println("success: " + result)
}
case Failure(exception) => {
//Do something with my error
println("failure")
}
}
val re = Await.result(r, 10 second)
答案 0 :(得分:1)
在Scala中,块中的最后一个表达式是代码块或函数的返回值。 scala中的关键字返回是可选的。
请注意,只有当一个任务返回true时,我们才会运行第二个任务。如果第一个任务返回false,那么我们就完成了。这意味着第一项任务对于我们作为决策者的计算非常重要。
您的版本已修改:
def longRunning1: Boolean = ???
def longRunning2: Boolean = ???
import scala.concurrent.ExecutionContext.Implicits.global
def foo(s : String): Future[Boolean] = Future {
val a: Boolean = longRunning1
if(a) {
val b: Boolean = longRunning2
b
} else false
}
版本1:
同时运行期货(计算或长期运行的方法)并稍后选择结果。如果我们考虑或想要第一次计算的结果,我们在这里放弃第二次计算的结果。
import scala.concurrent.ExecutionContext.Implicits.global
def foo(s: String): Future[Boolean] = {
val f1 = Future {
Thread.sleep(20000) //Just to simulate long running task
Random.nextBoolean()
}
val f2 = Future {
Thread.sleep(1000) //Just to simulate long running task
Random.nextBoolean()
}
(f1 zip f2) map {
case (false, _) => false
case (true, f2Result) => f2Result
case _ => false
}
}
第2版:
运行第一个方法,然后根据第一个方法的结果尝试一个接一个地运行第二个方法。使用map链接计算。
import scala.concurrent.ExecutionContext.Implicits.global
def foo(s: String): Future[Boolean] = {
val f1 = Future {
Thread.sleep(20000) //Just to simulate long running task
Random.nextBoolean()
}
f1.map { result =>
if (result) result
else {
Thread.sleep(1000) //Just to simulate long running task
Random.nextBoolean()
}
}
}