我一直在努力简化我在
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 举报,一经查实,本站将立刻删除。