Scala中,Future[Option[A]]如何进行类型转换?
In Scala, how to do type conversion for Future[Option[A]]?
例如有两个类:A
和B
。 A
中有一个方法叫做 toB
.
现在有一个 a
类型的值 Future[Option[A]]
,将其转换为 Future[Option[B]]
的最优雅方法是什么?
目前我正在使用 a.map(_.map(_.toB))
,但我认为它看起来有点笨拙和混乱。有没有人有更好的方法来做到这一点? (隐式转换)
谢谢!
如果您需要对Future[Option[?]]
的"stack"进行大量操作,您可以使用monad transformer:
val a: OptionT[Future, A] = OptionT(...)
val b: OptionT[Future, B] = a.map(_.toB)
如果您愿意在其中添加一些 scalaz
,您可以为此编写一个通用函数:
import scalaz._
import Scalaz._
def mapF[F[_]: Functor, G[_]:Functor,A,B](fg: F[G[A]], h : A => B) : F[G[B]] = fg.map( _.map(h))
它使用 "ugly" mapmap 版本,但它适用于任何 Functor
。
如果你想使用它中缀,只需为它创建一个隐式 class:
implicit class toMapF[F[_]:Functor,G[_]:Functor, A](fg : F[G[A]]){
def mapF[B](f: A => B) = fg.map( _.map(f))
}
然后你可以像这样使用它:
a.mapF(_.toB)
这当然是绝对矫枉过正,除非您已经在使用 scalaz
,但任何理由都值得尝试一下。
例如有两个类:A
和B
。 A
中有一个方法叫做 toB
.
现在有一个 a
类型的值 Future[Option[A]]
,将其转换为 Future[Option[B]]
的最优雅方法是什么?
目前我正在使用 a.map(_.map(_.toB))
,但我认为它看起来有点笨拙和混乱。有没有人有更好的方法来做到这一点? (隐式转换)
谢谢!
如果您需要对Future[Option[?]]
的"stack"进行大量操作,您可以使用monad transformer:
val a: OptionT[Future, A] = OptionT(...)
val b: OptionT[Future, B] = a.map(_.toB)
如果您愿意在其中添加一些 scalaz
,您可以为此编写一个通用函数:
import scalaz._
import Scalaz._
def mapF[F[_]: Functor, G[_]:Functor,A,B](fg: F[G[A]], h : A => B) : F[G[B]] = fg.map( _.map(h))
它使用 "ugly" mapmap 版本,但它适用于任何 Functor
。
如果你想使用它中缀,只需为它创建一个隐式 class:
implicit class toMapF[F[_]:Functor,G[_]:Functor, A](fg : F[G[A]]){
def mapF[B](f: A => B) = fg.map( _.map(f))
}
然后你可以像这样使用它:
a.mapF(_.toB)
这当然是绝对矫枉过正,除非您已经在使用 scalaz
,但任何理由都值得尝试一下。