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

开始玩Scala期货时,我被依赖期货卡住了

让我们举个例子。我搜索地点并获得一个
未来[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))