我想将Try[Option[T]]
展平为Try[T]
这是我的代码
def flattenTry[T](t: Try[Option[T]]) : Try[T] = {
t match {
case f : Failure[T] => f.asInstanceOf[Failure[T]]
case Success(e) =>
e match {
case None => Failure[T](new Exception("Parsing error"))
case Some(s) => Success(s)
}
}
}
有更好的方法吗?
答案 0 :(得分:6)
你可以尝试这样一些有点整洁的东西:
val t = Try(Some(1))
val tt = t.flatMap{
case Some(i) => Success(i)
case None => Failure(new Exception("parsing error"))
}
更一般地说,这将是:
def flattenTry[T](t: Try[Option[T]]) : Try[T] = {
t.flatMap{
case Some(s) => Success(s)
case None => Failure(new Exception("parsing error"))
}
}
诀窍是将Option
转换为Try
以使用flatmap。
答案 1 :(得分:0)
使用getOrElse
,您也可以写:
def flattenTry[T](t: Try[Option[T]]): Try[T] = {
t flatMap { o => o map (Success(_)) getOrElse Failure(new Exception("parsing error")) }
}
你可以让它更短,但可能以功能纯度(抛出是副作用)和性能(由于投掷/捕捉)为代价:
def flattenTry[T](t: Try[Option[T]]): Try[T] = {
Try(t.get getOrElse { throw new Exception("parsing error") })
}
答案 2 :(得分:0)
一种可能的方法是使用Try(o.get)
将o: Option
转换为o: Try
。
这非常简洁,但在处理None
时抛出并捕获异常,这有时可能是性能问题(或者有时候是意识形态/代码规则问题)。尽管如此,代码是如此简洁和可读性,我认为值得一提:
def flattenTry[T](t: Try[Option[T]]) : Try[T] = {
t.flatMap(o => Try(o.get))
}
注意:并非我建议使用它,但为了完整性:即使是较短的版本也可能,即使Try
失败也会抛出/捕获:
def flattenTry[T](t: Try[Option[T]]) : Try[T] = {
Try(t.get.get)
}