2017-06-27 11 views
2

を実装するためにどのように私はこの方法持っ先物組成

def findUserById(ids: Seq[String]): Future[Seq[User]] 

をしかし、私は先物を使ってといくつかの問題を抱えています。先物組成を正しく実装するにはどうすればよいですか?

私は実装(テストされていません)を持っていますが、もっと簡単にできると思います。あなたがflattensequence + traversemap、およびfilter + mapを置き換えることができます

override def findUsersById(ids: Seq[String]): Future[Seq[User]] = { 
    val futures = ids.map(id => findUserById(id)) 
    val filtered = Future.sequence(futures).map(_.filterNot(_.isEmpty)).map(_.map(_.get)) 
    filtered 
    } 

答えて

5

:一般Future.traverse

def findUsersById(ids: Seq[String]): Future[Seq[User]] = 
    Future.traverse(ids)(findUserById).map(_.flatten) 

Future.sequenceより簡潔である。また、私はその実装のパフォーマンスについてはよく分かりませんそれは中間の作成を避けるので、もう少し効果的ですSeq[Future[T]]

+0

秒後期:D – thwiegan

+0

「この実装のパフォーマンス」についても説明できますか?この場合の「将来の仕組み」についての簡単な説明は非常に役立ちます。 – oblivion

+0

@oblivion申し訳ありませんが、私はあなたがパフォーマンスと将来の仕組みについて知りたいことを理解していません。パフォーマンスに関しては、これはおそらく 'Future'sでできる最も効果的なアプローチの1つです(最後の' map'を削除することも可能ですが、小さな利益のためにコードが多すぎると思います)。 – Kolmar