如何从Future [Option [String]]获取Option [String]

时间:2019-12-11 11:35:50

标签: scala future

我是Scala的新手。我有一个def返回Future [Option [String]]。我必须从该定义返回Option [String]]。我无法使用Await.result。其他任何替代方法

def processJson(key: String, value:String) : Future[Option[String]]{
}

我已经通过此链接,但无法确定。

http://allaboutscala.com/tutorials/chapter-9-beginner-tutorial-using-scala-futures/#method-future-return-type

请帮助

3 个答案:

答案 0 :(得分:1)

我认为您可以通过Future而不等待其完成(调用方法将对其进行处理),也可以调用Await.result(但是您说这不是一种选择)。

无论如何,如果您不想处理Future,我不认为您应该返回Future,而只是处理一些JSON对象(从远距离来看,不是从远程服务器检索某些对象)。

答案 1 :(得分:1)

您可以:

  1. 等待他们(see here for demo):
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))
  1. 将线程休眠一段时间(see here for demo-根据您链接到的帖子):
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)
  1. 任凭未来,以后在内部进行映射(see here for demo):
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)等