【问题标题】:Future[Option[T]]: Keep future if Option is defined otherwise fallback to another futureFuture[Option[T]]:如果 Option 被定义,则保留未来,否则回退到另一个未来
【发布时间】:2020-01-19 06:37:51
【问题描述】:

我有这个val cacheElement:Future[Option[T]],如果OptionSome,则希望的结果是保留这个未来,或者如果未来是None,则基于另一个服务创建另一个Future[Option[T]]。使用模式匹配看起来像这样:

val cacheElement:Future[Option[T]] = cache.get[T](cacheKey)

for {
    opt <- cacheElement flatMap {
        case Some(cached) => Future { Some(cached) } 
        case None => createFallback(args)
           }
} yield { opt match {
        case Some(_) => //do something
        case None => // Do something else   
    }
}


def createFallback[T](args:T):Future[Option[T]] = ???-

我怎样才能以更优雅和简洁的方式做到这一点? Future { Some(cached) } 的重复在我看来非常冗长

【问题讨论】:

    标签: scala future


    【解决方案1】:
    import scala.concurrent.Future
    import scala.concurrent.Await
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.duration._
    
    type T = String
    
    val cacheElement: Future[Option[T]] = Future.successful(Some("asd"))
    val failElement: Future[Option[T]] = Future.successful(None)
    
    def createFallback: Future[T] = Future.successful("fallback")
    
    val s = cacheElement.flatMap(_.fold(createFallback)(Future.successful))
    val f = failElement.flatMap(_.fold(createFallback)(Future.successful))
    
    Await.result(s, 1.second)
    //res0: T = asd
    Await.result(f, 1.second)
    //res1: T = fallback
    

    【讨论】:

      【解决方案2】:

      来自猫的OptionT monad 转换器提供orElse 这样的语法

      OptionT(cacheElement) orElse OptionT(createFallback(args))
      

      例如

      import cats.data.OptionT
      import cats.implicits._
      import scala.concurrent.ExecutionContext.Implicits.global
      import scala.concurrent.Future
      
      object OptionTExample extends App {
        val f: Future[Option[Int]] = Future(None)
        def fallback: Future[Option[Int]] = Future(Some(-1))
        val v = OptionT(f) orElse OptionT(fallback)
        v.value.map(println)
      }
      

      输出

      Some(-1)
      

      【讨论】:

        猜你喜欢
        • 2016-11-08
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 1970-01-01
        • 2015-10-09
        • 2016-08-01
        • 1970-01-01
        相关资源
        最近更新 更多