Scala-如何根据Future过滤Seq

时间:2018-11-29 11:33:56

标签: scala future

我有一个简单的方法,该方法可以过滤所有有任何事件的人。因此,如果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))
      }

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