微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐