Scala - как отфильтровать базу Seq по Future - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть простой метод, который должен фильтровать всех людей, если у них есть какое-либо событие.Поэтому, если у Person нет события, его следует удалить из списка.Отфильтрованный список возвращается в конце.

 def filterPersonsWithEvents(persons: Seq[Person]): Seq[Person] = {
    persons.filter(sport => {         
      eventRepo.find(person.name) != null
    })
    persons
  }

Проблема в методе find из eventRepo return Future [Event].И этот метод не фильтрует persons хорошим способом.Как я должен изменить это, чтобы получить правильные результаты?Я новичок в Scala, поэтому, возможно, я не знаю некоторых «хитростей»

EDITED

Теперь мой код выглядит так:

 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 голосов
/ 29 ноября 2018

еще раз: traverse.traverse давайте возьмем List[X] и X => Future[Y] и дадим вам Future[List[Y]], чтобы он "переворачивал" содержащие типы.тогда вы можете просто map над внешним Future и filter внутренним List.

РЕДАКТИРОВАТЬ: Добавлена ​​ссылка на документацию для traverse типографская подпись немного страшна.

РЕДАКТИРОВАТЬ 2: чтобы завершить этот ответ.Вот полный пример https://scalafiddle.io/sf/p84FSFv/0

...