【问题标题】:Scala - How to return simple raw type value from flat map?Scala - 如何从平面地图返回简单的原始类型值?
【发布时间】:2023-04-04 09:21:02
【问题描述】:

我有一个简单的代码,我只想获得一个boolean 值,但它包含在Future 对象中:

def getValue(arg: String) : Boolean = for {
    data <- SomeObject.getData(arg) //SomeObject is in class constructor 
    value = data.getBooleanValue
} yield value

这里的问题是我需要返回Future[Boolean] 而不是简单的boolean。如何将其更改为仅返回原始类型?

【问题讨论】:

  • 你想要Future[Boolean]还是只是Boolean
  • 要从Future[Boolean] 中取出Boolean,您可以等待Future 完成,但这样做非常糟糕。它使整个Future 变得毫无意义。最好返回Future[Boolean]
  • @jacks jus 布尔
  • @jwvh - 是的,但是在返回 Future[Boolean] 之后我需要在其他地方使用这个值。
  • 然后,当您“在其他地方使用它”时,将其用作Future[Boolean] 而不是Boolean。这有点麻烦,但并不难。 Future 值的全部意义在于尽可能长时间地将其留在Future 中。如果您认为您必须等待Future,请再考虑一下。还有其他解决方案。

标签: scala future


【解决方案1】:

一旦您调用返回 Future 的 API,您需要链接您的代码以在该 Future 尽可能完成时执行。尽量避免等待Future 完成。

所以改方法返回Future

def getValue(arg: String): Future[Boolean] =
  SomeObject.getData(arg).map(_.getBooleanValue)

然后而不是调用

nextMethod(getValue(myArg))

像这样在Future 上使用map

getValue(myArg).map{ bool =>
  nextMethod(bool) // next processing step
}

这将提供一个新的Future,其中将包含下一步处理的结果。

虽然这确实需要重新编写调用代码,但 Scala 使这种代码非常易于编写。继续将操作链接到之前的 Future,直到处理完成。

在大多数情况下,代码会以发送消息或写入文件等副作用操作结束,在这种情况下,无需等待 Future 完成。

在极少数情况下确实需要等待Future,使用Await.result 来恢复Futures 链的最终结果

【讨论】:

  • 谢谢。但正是我想将像getValue(arg: String) 这样的函数作为参数传递给方法,它应该是布尔值,所以我不能在这里映射它以获得价值?
  • 我已经更新了答案以显示如何使用 Boolean 值作为方法的参数。
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多