将 Future[Object] 转换为另一个包含列表的 Future[Object]

问题描述 投票:0回答:1
我有一个调用第三方端点以返回 Future 类型的提供程序对象列表的方法。现在我想调用此方法并将该对象转换为包含列表的不同未来对象。以下是型号:

case class ThirdPartyProvidersResponse(providers: List[ThirdPartyProvider]) case class ThirdPartyProvider( id: String, config: List[Config] ) // Convert ThirdPartyProvidersResponse to DomainProvidersResponse case class DomainProvidersResponse( providers: List[DomainProviderResponse] ) case class DomainProviderResponse( code: Option[DomainProviderType], enabled: Boolean )
这是我尝试实现的方法签名:

def getProviders(): Future[DomainProvidersResponse]
这是API方法的定义:

def getProvidersList(): Future[ThirdPartyProvidersResponse]
这是我尝试过的:

def getProviders(): Future[DomainProvidersResponse] = { var providers: List[DomainProviderResponse] = List() thirdPartyServiceHttpClient.getProvidersList().map { response => response.providers.map { providersList => val provider = DomainProviderResponse( providerCode = DomainProviderType.findByName(providersList.id), enabled = true ) providers :+= provider } } Future.successful(DomainProvidersResponse(providers = providers)) }
这段代码的问题是同步。我需要等待 future 执行之后才能返回结果。我们可以使用 

flatMap

 通过立即执行转换而无需显式同步来实现此目的吗?

对此的任何帮助表示赞赏。我有 Java 背景,是 Scala 新手。

scala functional-programming
1个回答
0
投票
看来你需要类似

map

或理解的东西:

def getProviders(): Future[DomainProvidersResponse] = for { response <- thirdPartyServiceHttpClient.getProvidersList() domainProviders = response.providers.map { provider => DomainProviderResponse( providerCode = DomainProviderType.findByName(providersList.id), enabled = true ) } } yield DomainProvidersResponse(domainList) // or def getProviders(): Future[DomainProvidersResponse] = thirdPartyServiceHttpClient.getProvidersList().map { response => response.providers.map { provider => DomainProviderResponse( providerCode = DomainProviderType.findByName(providersList.id), enabled = true ) } }.map { domainProviders => DomainProvidersResponse(domainList) }
    
© www.soinside.com 2019 - 2024. All rights reserved.