我经常使用下面的函数来转换Option[Try[_]]
,Try[Option[_]]
但感觉不对。可以用更惯用的方式表达这样的功能吗?
def swap[T](optTry: Option[Try[T]]): Try[Option[T]] = {
optTry match {
case Some(Success(t)) => Success(Some(t))
case Some(Failure(e)) => Failure(e)
case None => Success(None)
}
}
假设我有两个值:
val v1: Int = ???
val v2: Option[Int] = ???
我想对这些值进行操作op
(可能会失败)并将其传递给f
下面的函数。
def op(x: Int): Try[String]
def f(x: String, y: Option[String]): Unit
我通常用于理解可读性:
for {
opedV1 <- op(v1)
opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)
PS。我想避免一些沉重的东西,比如scalaz。