gpt4 book ai didi

scala - 基于成功的结果失败的 future

转载 作者:行者123 更新时间:2023-12-04 23:56:02 25 4
gpt4 key购买 nike

我的代码中有一个场景,我需要制作一个 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())
}
}
}

所以在我这里的例子中,我想要 Future如果 Result 失败返回的值为 false为其成功指标。正如我提到的,我可以通过 flatMap 使这项工作正常进行,但我想消除的代码行是:
case _ => Promise.successful(result).future

这个说法似乎没有必要。我想要的行为是能够定义条件,如果它评估为真,允许我返回一个不同的 Future正如我正在做的,但如果它不是真的,就保持原样(有点像 PartialFunction 语义。有没有办法做到这一点,我只是没有看到?我看过 collecttransform 而那些似乎也不合适。

编辑

拿到后 map来自@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 .

最佳答案

您可以使用 map 轻松完成此操作:

val f = Future{ Result(false) } map {
case Result(false) => throw new Exception("The call failed!!")
case x => x
}

但是您仍然需要明确提及您正在传递身份。

请注意,您 should not使用 andThen在这种情况下。 andThen是为了副作用,而不是为了改变结果(与 Function1 同名方法不同)。

关于scala - 基于成功的结果失败的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com