我是Scala的新手。我有一个def返回Future [Option [String]]。我必须从该定义返回Option [String]]。我无法使用Await.result。其他任何替代方法
def processJson(key: String, value:String) : Future[Option[String]]{
}
我已经通过此链接,但无法确定。
请帮助
答案 0 :(得分:1)
我认为您可以通过Future而不等待其完成(调用方法将对其进行处理),也可以调用Await.result
(但是您说这不是一种选择)。
无论如何,如果您不想处理Future,我不认为您应该返回Future,而只是处理一些JSON对象(从远距离来看,不是从远程服务器检索某些对象)。
答案 1 :(得分:1)
您可以:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def returnsAFuture: Future[Int] = Future {
Thread.sleep(1000)
10
}
import scala.concurrent.Await
import scala.concurrent.duration._
println(Await.result(returnsAFuture, Duration.Inf))
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def returnsAFuture: Future[Int] = Future {
Thread.sleep(1000)
10
}
import scala.util.Success
returnsAFuture.onComplete {
case Success(value) => println(value)
case _ => println("No value found")
}
Thread.sleep(2000)
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def returnsAFuture: Future[Int] = Future {
Thread.sleep(1000)
10
}
val aNewFuture = returnsAFuture.map {_ * 2}
// do some other stuff
// access the result of the Future only when you absolutely have to
import scala.concurrent.Await
import scala.concurrent.duration._
println(Await.result(aNewFuture, Duration.Inf))
Future的全部要点是,您可以假设它可以成功解决,方法是将其保留为Future的时间尽可能长,并处理在最后可能的时刻抛出的任何异常。
如果您使用的是Play之类的框架,则只需在最后返回一个Future,Play就会为您解决。如果不是,那么您将需要等待Future结束。
不过,我还是建议您选择选项3,这样您就可以将其保留到最后一刻,而不必过早地阻塞线程。
答案 2 :(得分:0)
可能在使用期货时,您应该等待,但是很少有这样的情况,因为通常在使用期货时,您有一个连续运行的应用程序,因此您只需选择使用转换器(map,flatmap,用于表达式)或消费者(foreach,onComplete)等