我想过滤掉输入数据中的错误输入。我目前正在使用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))
答案 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方法那样具有可扩展性。