Scala 独立期货
开始玩Scala期货时,我被依赖期货卡住了 让我们举个例子。我搜索地点并获得一个Scala 独立期货,scala,playframework-2.0,future,Scala,Playframework 2.0,Future,开始玩Scala期货时,我被依赖期货卡住了 让我们举个例子。我搜索地点并获得一个未来[Seq[Place]]。对于这些地方中的每一个,我都会搜索最近的地铁站(这项服务会在未来[List[Station]]]中重新出现) 我将写下: Place.get() .map { places => places.map { place => Station.closestFrom(place).map { stations => Searc
未来[Seq[Place]]
。对于这些地方中的每一个,我都会搜索最近的地铁站(这项服务会在未来[List[Station]]]中重新出现)
我将写下:
Place.get()
.map { places =>
places.map { place =>
Station.closestFrom(place).map { stations =>
SearchResult(place, stations)
}
}
}
那东西会让我得到一个Future[Seq[Future[SearchResult]]]
。。。这是。。。不是我所期望的
我错过了什么才能获得未来[Seq[SearchResult]]
谢谢大家
Alban您的解决方案中缺少两个
Future
概念:flatMap
和Future.sequence
要解释每一点:
flatMap
与map
类似,不同之处在于没有从future.map(a=>B)中为它提供函数,而是从future.flatMap(a=>future[B])
中为它提供函数。通过这种方式,你可以将未来联系在一起
Future.sequence
是一个帮助函数,它将未来列表与列表的未来相结合:Seq[Future[a]=>Future[Seq[a]]
使用Future
API的这两个功能,我们可以将您的答案更改为:
Place.get().flatMap { places =>
Future.sequence(places.map { place =>
Station.closestFrom(place).map { stations =>
SearchResult(place, stations)
}
})
}
短版
使用futures通常比直接使用map/flatMap更容易理解。在您的情况下,它应该如下所示:
for {places <- Place.get()
searchResults <- Future.traverse(places)(place => for (stations <- Station.closestFrom(place))
yield SearchResult(place,stations)
)
} yield searchResults
相当于(无优化):
不要犹豫使用它来理解,它真的很有帮助。很好!但您的示例似乎没有按“原样”编译。未定义place
变量。。。我说得对吗?但它确实很快就在添加一个位置。很抱歉,新版本这次应该可以了。
for { variable1 <- f1
variable2 <- f2
} yield expression
f1.flatMap( variable1 => f2.map(variable2 => expression))