如何展平试试[选项[T]]

时间:2013-11-26 13:48:08

标签: scala scala-option

我想将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)
      }
  }
}

有更好的方法吗?

3 个答案:

答案 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)
}