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

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方法不同).

(编辑:李大同)

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

    推荐文章
      热点阅读