6

我想将 a 展平Try[Option[T]]为 aTry[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)
      }
  }
}

有没有更好的办法 ?

4

4 回答 4

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为使用平面图。

于 2013-11-26T13:53:28.307 回答
5

将尝试转换为选项然后展平:

val t = Try(Some(1))
val o = t.toOption.flatten
于 2016-08-23T12:59:20.583 回答
0

一种可能的方法是使用Try(o.get)to 转换o: Optiono: 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)
}
于 2018-03-16T15:41:07.410 回答
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") })
}
于 2016-01-18T20:05:28.360 回答