Scala:返回Future [Boolean]的方法中的多个return语句

时间:2016-11-04 09:55:17

标签: scala concurrency future

我想做这样的事情。

 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)

1 个答案:

答案 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()
      }
    }

  }