我试图将字符串列表解析为数字格式,而忽略了无法解析的任何内容。这是我的尝试,但我无法帮助,但认为这是一个足够普遍的模式,必须有一个比调用2个地图和过滤器更好的方法。有人可以建议一种更规范的方法吗?也许使用某种部分功能?谢谢!
git svn clone -s <svn_url>
cd repo_name
#work#work#work
git svn rebase
git svn dcommit
输出:
if ("Bob".equals(data[i][j]))
答案 0 :(得分:9)
flatMap
有帮助:
scala> List("1","2","foo","4").flatMap(s => scala.util.Try(s.toDouble).toOption)
res0: List[Double] = List(1.0, 2.0, 4.0)
答案 1 :(得分:5)
请记住,异常会让您失望很多。因此,尽管Try
方法有效,但如果大多数事情都不是数字,那么它将无法很快发挥作用。
你可以写一个正则表达式来挑选可能是双打的东西:
val D = """(-?[0-9]+(?:\.[0-9]+)(?:[eE]?[+-]?[0-9]+)?)""".r
然后你只会尝试解析实际上是双打的东西:
val xs = List("1", "2", "foo", "4")
xs.collect{
case D(x) => x.toDouble
case "NaN" => Double.NaN
case "Infinity" => Double.PositiveInfinity
case "-Infinity" => Double.NegativeInfinity
}
根据应用程序,当有大量非Double条目时(例如,在您的示例中为1/4),它大约快10-60倍。
答案 2 :(得分:3)
使用collect
和模式匹配:
scala> List("1", "2", "foo", "4")
.map(s => Try(s.toDouble))
.collect { case Success(x) => x }
res3: List[Double] = List(1.0, 2.0, 4.0)
答案 3 :(得分:0)
使用for comprehension可以获得所需的结果,例如
for {
x <- xs
v <- Try(x.toDouble).toOption
} yield v
请注意,评估为v
的{{1}}不会产生。{/ p>