5

に変身する方法Future[Option[Future[Option[X]]]]Future[Option[X]]

TraversableOnce代わりにFutureコンパニオン オブジェクトOptionを使用します。しかし、オプションはどうですか?

例:

def processAndReturnFuture(x:String):Future[String] = future(x)
def processAgainAndReturnOption(x:String):Option[String] = Some(x)

val futOpt:Future[Option[String]] = future(Some("x"))
val futOptFutOpt:Future[Option[Future[Option[String]]]] =
  futOpt.map( opt =>
    opt.map( x =>
      processAndReturnFuture(x).map( processedX =>
        processAgainAndReturnOption(processedX)
      )
    )
  )
4

4 に答える 4

1

この問題に関する私の見解は次のとおりです。

val futOptFutOpt: Future[Option[String]] =
  futOpt.map(_.toSeq)
    .flatMap(Future.traverse(_)(processAndReturnFuture))
    .map(_.headOption)

これが基本的に行うことは、

  1. futOptから に変換Future[Option]するFuture[Seq]
  2. Seqwithの各要素を処理しprocessAndReturnFuture、新しいFuture[Seq]
  3. Future[Seq]に戻すFuture[Option]
于 2016-08-05T13:11:16.670 に答える
1

正確な答えではありませんが、推奨事項: 再帰的に作成することを避け、代わりに for-yield を使用してください

def someFunc(fo1: Future[Option[String]], fo2: Future[Option[String]]): Future[Option[String]] ={
    //this is what we want to avoid
    //val fofo1:Future[Option[Future[Option[String]]]] = fo1.map(o => o.map(s => fo2))

    //instead use for
    val res : Future[Option[String]] = for {
        o1 <- fo1
        o2 <- fo2
    }yield{
        println(o1 + "do what ever you want" + o2)
        //or use for a second time
        for{
            s1 <- o1
            s2 <- o2
        }yield{
            s"$o1, $o2"
        }
    }
    res
} 
于 2016-09-21T18:34:03.557 に答える