下面的代码抛出异常:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0 at line (s(0).toString,s(0).toString)
我想捕获此异常并将map函数继续到下一个项目。如何围绕高阶函数包围try / catch以忽略任何异常并继续执行其余功能:groupBy& mapValues?
println(toIterate.toList.map(s => (s(0).toString,s(0).toString))
.groupBy(_._1)
.mapValues(_.map(_._2)))
答案 0 :(得分:3)
您可以String
进行Try
索引编制。 Try
将返回Success
或Failure
,如下例所示。然后,您可以匹配这些值以组成表达式的其余部分。我会把它作为锻炼给你。
scala> val f = "foo"
f: String = foo
scala> List(0,1,2,3,4).map(xs => Try(f(xs)))
res0: List[scala.util.Try[Char]] = List(Success(f), Success(o), Success(o), Failure(java.lang.StringIndexOutOfBoundsException: String index out of range: 3), Failure(java.lang.StringIndexOutOfBoundsException: String index out of range: 4))
答案 1 :(得分:0)
如果您的目标是过滤掉发生异常的项目,则应使用filter
:
println(toIterate.toList
.filter(_.length > 0)
.map(s => (s(0).toString,s(0).toString))
.groupBy(_._1)
.mapValues(_.map(_._2)))
答案 2 :(得分:0)
如果您的问题与try和catch的sytax有关,Google搜索“try catch scala”会显示一些选项。但我认为一个更现实的答案是在模式映射时使用和“if”条件(引用这篇优秀的文章)和“收集”
像这样的事情(对不起,您可能需要使用语法)println(toIterate.toList.collect(case(s) if s.len>0).map( s => (s(0).toString,s(0).toString)) .groupBy(_._1) .mapValues(_.map(_._2)))