将列表[尝试[A]]转换为Scala中的列表[A]

时间:2015-01-15 01:10:44

标签: scala exception error-handling try-catch

我想过滤掉输入数据中的错误输入。我目前正在使用scala.util.Try来包装任何异常。以下是3I抛出NumberFormatException的简单示例。我想知道在Scala中是否有更好的方法可以做到这一点?

val data = List ( ("Joe", "20"), ("James", "30"), ("Pete", "3I") )

scala> val parsedData = data.map{ d => Try{Person( d._1, d._2.toInt ) }}
parsedData: List[scala.util.Try[Person]] = List(Success(Person(Joe,20)), Success(Person(James,30)), Failure(java.lang.NumberFormatException: For input string: "3I"))

scala> val validdata = parsedData.map{ x => x match {
     | case Success(s) => Some(s)
     | case Failure(f) => None }
     | }
validdata: List[Option[Person]] = List(Some(Person(Joe,20)), Some(Person(James,30)), None)

scala> validdata.flatten
res13: List[Person] = List(Person(Joe,20), Person(James,30))

2 个答案:

答案 0 :(得分:15)

使用collect仅保留与所需模式匹配的值:

parsedData collect { case Success(x) => x }

这也可行,但我认为不太清楚:

parsedData.flatMap(_.toOption)

答案 1 :(得分:0)

绕过使用Try的一种方法,如下所示,

for ( d <- data if d._2.forall(_.isDigit) ) yield Person(d._1, d._2.toInt)

然而,这可能不像@ m-z方法那样具有可扩展性。