scala – Future [期权[期货[期权[布尔]]简化期货和期权?

我一直在努力简化我在 Scala中做期货的方式.我得到了一个Future [Option [Future [Option [Boolean]],但我在下面进一步简化了它.有没有更好的方法来简化这个?

传递“失败”的未来似乎不是最好的方法.即在顺序世界中,我只是返回“FAIL !!”任何时候它失败而不是继续到最后.还有其他方法吗?

val doSimpleWork = Future {
  //Do any arbitrary work (can be a different function)
  true //or false
}

val doComplexWork = Future {
  //Do any arbitrary work (can be a different function)
  Some("result") //or false
}

val Failed = Future {
  //Do no work at all!!! Just return
  false
}

val fut1 = doSimpleWork
val fut2 = doSimpleWork

val fut3 = (fut1 zip fut2).map({
  case (true,true) => true
  case _ => false
})

val fut4 = fut3.flatMap({
  case true =>
    doComplexWork.flatMap({
      case Some("result") =>
        doSimpleWork
      case None =>
        Failed
    })
  case false =>
    Failed
})

fut4.map({
  case true =>
    "SUCCESS!!!"
  case _ =>
    "FAIL!!"
})

解决方法

请注意,在您的示例中,因为您急切地将Futures实例化为val,所以它们一旦声明它们就会开始执行(val x = Future {…}).使用方法将使Futures仅在执行链请求时执行.

避免进一步计算的一种方法是抛出异常,然后使用onFailure处理它:

def one = future { println("one") ; Some(1) }
def two = future { println("two") ; throw new Exception("no!"); 2 }
def three = future { println("three") ; 3 }

val f = one flatMap {
  result1 => two flatMap {
    result2 => three
  }
}

f onFailure {
  case e: Exception =>
    println("Failed somewhere in the chain")
}

你可以在这里看到“三”不应该打印出来,因为我们两个都失败了.情况就是这样:

one 
two 
Failed somewhere in the chain

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...