scala – 基于成功的结果使未来失败
发布时间:2020-12-16 10:04:05 所属栏目:安全 来源:网络整理
导读:我的代码中有一个场景,我需要根据包含特定值的成功结果使Future失败.我可以通过flatMap使这项工作正常,但我想知道是否有更简洁的方法来完成这项工作.首先,一个非常简单的例子: import concurrent._case class Result(successful:Boolean)object FutureTest
我的代码中有一个场景,我需要根据包含特定值的成功结果使Future失败.我可以通过flatMap使这项工作正常,但我想知道是否有更简洁的方法来完成这项工作.首先,一个非常简单的例子:
import concurrent._ case class Result(successful:Boolean) object FutureTest { def main(args: Array[String]) { import ExecutionContext.Implicits._ val f = Future{Result(false)}.flatMap{ result => result match{ case Result(false) => Promise.failed(new Exception("The call failed!!")).future case _ => Promise.successful(result).future } } f onFailure{ case x => println(x.getMessage()) } } } 所以在我的例子中,如果返回的Result的成功指标值为false,我希望Future失败.正如我所提到的,我可以使用flatMap使这项工作正常,但我想要消除的代码行是: case _ => Promise.successful(result).future 这句话似乎没必要.我想要的行为是能够定义条件,如果它的计算结果为true,那么允许我像我一样返回一个不同的Future,但是如果它不是真的,那就保持原样(就像PartialFunction一样)有没有办法做到这一点,我只是没有看到?我已经看过收集和转换,这些看起来也不合适. 编辑 在从@Rex Kerr和@ senia获得地图建议后,我创建了一个PimpedFuture和一个隐式转换,使代码有点像这样: class PimpedFuture[T](f:Future[T])(implicit ex:ExecutionContext){ def failWhen(pf:PartialFunction[T,Throwable]):Future[T] = { f map{ case x if (pf.isDefinedAt(x)) => throw pf(x) case x => x } } } 隐含的 implicit def futToPimpedFut[T](fut:Future[T])(implicit ec:ExecutionContext):PimpedFuture[T] = new PimpedFuture(fut) 和新的处理代码: val f = Future{ Result(false) } failWhen { case Result(false) => new Exception("The call failed!!") } 我认为这仍然是一个更清洁,同时仍然使用建议使用地图. 解决方法
您可以使用map轻松完成此操作:
val f = Future{ Result(false) } map { case Result(false) => throw new Exception("The call failed!!") case x => x } 但你仍然需要明确提到你正在传递身份. 请注意,您在这种情况下使用了should not.然后是副作用,而不是更改结果(与同名的Function1方法不同). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |