3

Я новичок в Scala с Java, поэтому для меня все еще сложно понять функциональное программирование. У меня есть проект в Play Framework. Мне нужно запросить базу данных, чтобы получить строки с идентификаторами и отобразить их в html-шаблоне.Получить будущие объекты из будущих опций в Scala

Вот мой код

def search(query: String) = Action.async{ request => 
    val result = SearchEngine.searchResult(query) 
    val docs = result.map(DocumentService.getDocumentByID(_).map(doc => doc)) 
    val futures = Future.sequence(docs) 
    futures.map{documents => 
     Ok(views.html.results(documents.flatten)) 
    } 
    } 

getDocumentByID возвращает Future[Options[Document]] объекта, но мой results шаблон принимает Array[Document], так что я пытался без толка превратить Future[Options[Document]] в Array[Document]

Текущего код у меня есть, самый близкий я был, но он все еще не компилируется. Это ошибка:

Error:(36, -1) Play 2 Compiler: 
    found : Array[scala.concurrent.Future[Option[models.Document]]] 
    required: M[scala.concurrent.Future[A]] 

ответ

3

Попробуйте collect только Some с из будущего возвращенного getDocumentByID

val docs = result.map { res => 
    val f: Future[Option[Document]] = DocumentService.getDocumentByID(res) 
    f.collect { case Some(doc) => doc } 
}.toList 

val futures = Future.seqence(docs) //notice that docs is converted to list from array in the previous line 

предложение Генерального

Не используйте Array с. Массивы изменяемы, и они не растут динамически. Поэтому рекомендуется избегать использования массива в параллельном/параллельном коде.

+1

Я только что сделал это, но есть ошибка в 'Ok (views.html.results (documents.flatten))' line. Он говорит: 'тип несоответствия, ожидаемый: массив [Document], фактический: Array [Nothing]' – Ken

+0

@Ken remove 'flatten' – pamu

+0

Когда я его удаляю, все еще есть ошибка:' Тип несоответствия, ожидаемый: Array [Document], actual : mutable.ArrayOps [Document] ' – Ken

Смежные вопросы