加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:57:35 所属栏目:安全 来源:网络整理
导读:我一直在努力简化我在 Scala中做期货的方式.我得到了一个Future [Option [Future [Option [Boolean]],但我在下面进一步简化了它.有没有更好的方法来简化这个? 传递“失败”的未来似乎不是最好的方法.即在顺序世界中,我只是返回“FAIL !!”任何时候它失败而
我一直在努力简化我在 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读