首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:未来穿越中的未来恢复

Scala:未来穿越中的未来恢复
EN

Stack Overflow用户
提问于 2022-07-05 14:53:57
回答 2查看 81关注 0票数 1

我有一个方法,它可能抛出异常取决于传递的值:

代码语言:javascript
复制
 private def transform(in: Int): Future[Boolean] = in match {
    case i if i < 0 => Future.successful(true)
    case i if i > 0 => Future.successful(false)
    case i if i == 0 => throw new IllegalStateException()
 }

第二种方法是将上述方法并行地应用于列表中的各个元素。

代码语言:javascript
复制
def massTransform(ints: List[Int])(implicit ex: ExecutionContext): 
    Future[List[Boolean]] = {
            Future.traverse(ints){
               i => transform(i).recover {
                                           case e: IllegalStateException => false
                                          }
   }
}

我预计,恢复将捕获IllegalStateException并返回未来(False)。但是我的代码在IllegalStateException中失败了

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-05 16:00:14

问题是您正在抛出一个Future之外。您需要将异常包装在Future中,否则所发生的情况是该方法本身抛出而不是返回失败的Future。您可以将方法简化如下:

代码语言:javascript
复制
def transform(in: Int): Future[Boolean] =
  if (in == 0) Future.failed(new IllegalStateException)
  else Future.successful(in < 0)

您可以使用这个代码这里是Scastie

这看起来像是你实际逻辑的简化。如果情况不是这样(或不完全),我建议删除不必要的Future嵌套,如下所示:

代码语言:javascript
复制
def transform(in: Int): Boolean =
  if (in == 0) throw new IllegalStateException else in < 0

def massTransform(
    ints: List[Int]
)(implicit ex: ExecutionContext): Future[List[Boolean]] =
  Future(ints.map { i =>
    try transform(i)
    catch { case e: IllegalStateException => false }
  })

注意transform方法抛出和异常处理是如何在Future构造函数中完成的。

您也可以使用这个第二个版本的论斯卡斯蒂

票数 2
EN

Stack Overflow用户

发布于 2022-07-05 15:15:58

transform的实现不正确,应该是:

case i if i == 0 => Future.failed(new IllegalStateException())

我想这是一个简化的例子,因为这段代码实际上并不能并行计算,除非transform实际上在执行IO或相当昂贵的计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72871482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档