我正在使用cats,想知道如何使用它来转换数据。
这
val data = Either[Error, Option[Either[Error, Account]]]
到
val target: Either[Error, Option[Account]] = howToConvert(data)
如果发生任何Error
,则结果将为Left(error)
,并显示第一个错误。
我现在可以用:
data match {
case Left(e) => Left(e)
case Right(Some(Right(y))) => Right(Some(y))
case Right(Some(Left(e))) => Left(e)
case Right(None) => Right(None)
}
但我正在寻找一些简单的方法
答案 0 :(得分:6)
执行此操作的最简单方法是sequence
内部Option
,以便获得Either[Error, Either[Error, Option[Account]]]
然后展平它。
使用猫语法,这非常简单:
import cats.implicits._
val target: Either[Error, Option[Account]] =
data.flatMap(_.sequence)
为了澄清,sequence
转换了一个类型构造函数" out out",意味着内部Option[Either[Error, Account]]
变成Either[Error, Option[Account]]
。
答案 1 :(得分:1)
这是一个轻松的"只假设一个右偏的Either(Scala 2.12)或者猫#39;语法
val target: Either[Error, Option[Account]] =
data.flatMap(_.map(_.map(Some(_))).getOrElse(Right(None)))