我有一个简单的方法,该方法可以过滤所有有任何事件的人。因此,如果Person
没有任何事件,则应将其从列表中删除。最后返回过滤的列表。
def filterPersonsWithEvents(persons: Seq[Person]): Seq[Person] = {
persons.filter(sport => {
eventRepo.find(person.name) != null
})
persons
}
问题是find
中的方法eventRepo
返回Future [Event]。而且此方法不能很好地过滤persons
。我应该如何更改以获得正确的结果?我是Scala的新手,所以也许我不知道某些“技巧”
已编辑
现在我的代码如下:
def filterPersonsWithEvents(persons: Seq[Person]): Seq[Person] = {
Future.traverse(persons)(person => {
eventRepo.find(person.name).map(e => person-> e)
}).map(_.filter(_._2 != null).map(_._1))
}
答案 0 :(得分:1)
更多解决方案是traverse
。遍历让我们采用List[X]
和X => Future[Y]
并给您Future[List[Y]]
,以便它“翻转”包含的类型。那么您可以map
放在外部Future
上,filter
放在内部List
上。
编辑:为traverse
添加了doc链接,但typesignature有点吓人。
编辑2:使该答案完整。这里有一个完整的示例https://scalafiddle.io/sf/p84FSFv/0