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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |