使用try catch环绕失败的高阶函数?

时间:2013-08-30 22:22:34

标签: scala

下面的代码抛出异常:

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)))

3 个答案:

答案 0 :(得分:3)

您可以String进行Try索引编制。 Try将返回SuccessFailure,如下例所示。然后,您可以匹配这些值以组成表达式的其余部分。我会把它作为锻炼给你。

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”条件(引用这篇优秀的文章)和“收集”

http://danielwestheide.com/blog/2012/12/12/the-neophytes-guide-to-scala-part-4-pattern-matching-anonymous-functions.html#comment-975636567

像这样的事情(对不起,您可能需要使用语法)

println(toIterate.toList.collect(case(s) if s.len>0).map( s => (s(0).toString,s(0).toString)) .groupBy(_._1) .mapValues(_.map(_._2)))