将值从 Future 映射到对象而不是 Future[Object]

问题描述 投票:0回答:1

我有一个返回

Future[State]
的函数,另一个我需要返回
StateSimplified
对象的函数

//class State
case class State(id: String, label: String, postalCode: String, extension: Long...)

//class StateSimplified
case class StateSimplified(id: String, label: String)

现在我有这个功能了

def getSimple(relationId: Int): Future[StateSimplified] = {
  repository.findStateByRelationId(relationId).map(state => 
    StateSimplified(id = state.id, label = state.label))
}

repository.findStateByRelationId(relationId: Int)
是一个从相关表中查找状态的函数,该函数返回一个
Future[State]
问题是我需要一个
StateSimplified
而不是
Future[StateSimplified]
因为 StateSimplified 我需要将它放在另一个类中

case class City(id: Int, name: String, population: Long,..., state: StateSimplified)

如何将结果从

repository.findStateByRelationId(relationId: Int)
映射到
StateSimplified
而不是
Future[StateSimplified]

编辑: 在这个建议的问题中,标题是如何等待Future,但作为解决方案的答案标记表明该函数返回一个Future,并且不想在我的函数中返回Future,因为稍后该对象将进入另一个不同的

City
有一个名为
state
的属性,其类型为
StateSimplified

scala future
1个回答
0
投票

正如评论中所说,当你得到

Future
时,你有 2 个选择:

  1. 继续使用它,使用
    map
    flatMap
    或其他操作。所有这一切都是非阻塞
  2. 等待它返回值。这是阻塞

大多数时候,您想要执行 (1) 直到应用程序的主类。在任何像样的 Web 框架中,您甚至不需要 (2),框架会为您处理。

回到你的案例,这意味着你应该这样做:

val futureCity: Future[City] = getSimple(...).map { stateSimplified =>
  // Build or set in a City
  City(...)
}

// Then work with the Future[City] rather than the City directly using map or flatMap...
© www.soinside.com 2019 - 2024. All rights reserved.