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

斯卡拉 – 连锁期货尝试块?

发布时间:2020-12-16 09:42:49 所属栏目:安全 来源:网络整理
导读:是否可以链接scala.util.Try和scala.concurrent.Future?它们都有效地提供相同的monadic接口,但尝试链接它们会导致编译错误。 例如。鉴于以下两个签名 def someFuture:Future[String] = ???def processResult(value:String):Try[String] = ??? 有可能做如下
是否可以链接scala.util.Try和scala.concurrent.Future?它们都有效地提供相同的monadic接口,但尝试链接它们会导致编译错误。

例如。鉴于以下两个签名

def someFuture:Future[String] = ???
def processResult(value:String):Try[String] = ???

有可能做如下的事情吗?

val result = for( a <- someFuture; b <- processResult( a ) ) yield b;
result.map { /* Success Block */ } recover { /* Failure Block */ }

这显然导致编译错误,因为Future和Try无法在一起平坦化。

能否连接他们是一个很好的功能 – 这是可能的吗?或者我需要将它们组合成未来[Try [String]]?

(特别是,我有兴趣在未来或尝试中单个“恢复”块捕获异常。

解决方法

当遇到这样的问题时,您希望在理解中使用不同的类型,一个解决方案可以是尝试并选择其中一种类型,并将其他类型映射到它。对于您的情况,鉴于期货的独特财产(异步),我将选择“未来”作为最低的共同点,并映射“未来”。你可以这样做:

val result = for{
  a <- someFuture
  b <- tryToFuture(processResult(a)) 
}  yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }

def tryToFuture[T](t:Try[T]):Future[T] = {
  t match{
    case Success(s) => Future.successful(s)
    case Failure(ex) => Future.failed(ex)
  }
}

现在,如果你发现这是一个非常常见的情况,并且你不喜欢不断添加显式转换,我想你可以将tryToFuture方法定义为隐藏在一些帮助对象上,并在需要的地方导入它:

object FutureHelpers{
  implicit def tryToFuture[T](t:Try[T]):Future[T] = {
    t match{
      case Success(s) => Future.successful(s)
      case Failure(ex) => Future.failed(ex)
    }
  }
}

import FutureHelpers._
val result = for{
  a <- someFuture
  b <- processResult(a) 
}  yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }

只要记住,调用Future.success和Future.failed会对任何ExecutionContext的范围产生影响,因为它将在另一个任务下提交另一个任务。

编辑

正如Viktor在评论中指出的那样,如果您只是使用Future.fromTry,就像在下面的更新示例中一样,将Try转换为aFuture的过程更容易:

val result = for{
  a <- someFuture
  b <- Future.fromTry(processResult(a)) 
}  yield b
result.map { /* Success Block */ } recover { /* Failure Block */ }

这可能是您最好的选择,而不是使用隐含的内容或滚动您自己的转换逻辑。

(编辑:李大同)

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

    推荐文章
      热点阅读