3

私はJavaからScalaを初めて使いました。そのため、関数型プログラミングのことはまだ分かりません。 Playフレームワークにプロジェクトがあります。 idsを使って行を取得し、それらを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

Array Sを使用しないでください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 

一般的な提案

によって返された未来からcollectのみSome秒にしてみてください。これはエラーです。配列は可変であり、動的には増加しません。 したがって、並行/並列コードでArrayを使用しないことをお勧めします。

+1

私はちょうどそれをしましたが、 'Ok(views.html.results(documents.flatten))'行にエラーがあります。それは言う: 'type mismatch、expected:Array [ドキュメント]、実際:配列[なし]' – Ken

+0

@Kenは 'flatten'を取り除きます – pamu

+0

これを取り除くと、まだエラーがあります:'型不一致、期待値:Array [Document]、actual :mutable.ArrayOps [ドキュメント] ' – Ken