【问题标题】:how to transform Future[Option[(Person, Future[Vector[Order]])]] into Future[Option[(Person, Vector[Order])]]如何将 Future[Option[(Person, Future[Vector[Order]])]] 转换为 Future[Option[(Person, Vector[Order])]]
【发布时间】:2020-03-16 16:42:58
【问题描述】:

我目前有这个:

def maybePerson(id: Int): Future[Option[Person]] = ???
def orders(personId : Int): Future[Vector[Order]] = ???

val maybePersonAndOrders: Future[Option[(Person, Future[Vector[Order]])]] =
  maybePerson(is = 10).map(_.map { person =>
    (person, orders(person.id))
  })

如何将其转化为(将两个futurs合二为一):

val maybePersonAndOrders: Future[Option[(Person, Vector[Order])]] = ???

【问题讨论】:

    标签: scala future


    【解决方案1】:

    考虑OptionT monad 转换器

    (for {
      person <- OptionT(maybePerson(42))
      orders <- OptionT.liftF(orders(person.id))
    } yield {
      (person, orders)
    }).value
    

    这是一个工作示例

    import cats.data.OptionT
    import cats.implicits._
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.Future
    
    object OptionTExample extends App {
    
      case class Person(id: Int, name: String)
      case class Order(personId: Int)
    
      def maybePerson(id: Int): Future[Option[Person]] = Future(Some(Person(42, "picard")))
      def orders(personId : Int): Future[Vector[Order]] = Future(Vector(Order(personId)))
    
      val maybePersonAndOrders: Future[Option[(Person, Vector[Order])]] = {
        (for {
          person <- OptionT(maybePerson(42))
          orders <- OptionT.liftF(orders(person.id))
        } yield {
          (person, orders)
        }).value
      }
    
      maybePersonAndOrders.map(println)
      Thread.sleep(1000)
    }
    

    哪个输出

    Some((Person(42,picard),Vector(Order(42))))
    

    【讨论】:

    • 如果maybePerson 返回光滑的DBIOAction[Option[Person], NoStream, Effect] 而不是Future[Option[Person]] 怎么办?还可以使用OptionT吗?我试过了,但我得到了这个编译错误:no type parameters for method apply: (value: F[Option[A]])cats.data.OptionT[F,A] in object OptionT exist so that it can be applied to arguments (slick.jdbc.MySQLProfile.api.DBIOAction[Option[io.iproduct.model.Page],slick.jdbc.MySQLProfile.api.NoStream,slick.jdbc.MySQLProfile.api.Effect])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2019-10-25
    • 2015-11-03
    • 2019-01-07
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多