Scala在成功的情况下收益,但在例外的情况下不要

时间:2014-05-22 22:22:13

标签: scala pattern-matching yield

我在Scala中有一个Seq [T],并希望对每个元素做一些事情。如果成功,我想将结果输出到为了理解而创建的Seq,但是我不想在出现异常的情况下产生任何结果。

我想要这样的事情:

val destinations = for(path <- files) {
  try {
    yield tryReadDestinations(path) 
  } catch {
    case _ => log.error("Error happened :(")
  }
}

但是当然这样的代码不能编译。我怎样才能实现这样的目标呢?

更新:

我设法得到这样的东西:

files
  .map(a => tryExtractDestinationsFromAttachment(a))
  .filter {
    case Success(d) => true
    case Failure(_) => false
  }
  .map(t => t.get)
  .flatten

tryExtractDestinationsFromAttachment返回Try[String]

但我相信它可以使它更简单/更具可读性吗?

2 个答案:

答案 0 :(得分:4)

您可以将每个读取包装在Try中并执行以下操作:

files
    .map(f => Try(tryReadDestinations(f)))
    .map(t => t.recoverWith { case ex => log.error(ex); t })
    .flatMap(_.toOption)

答案 1 :(得分:0)

这是你要找的吗?

import scala.util.{Try, Success, Failure}

def extractDestinationsFromAttachment(path: Path): Seq[Destination] = ???

val destinations = files flatMap { path =>
  Try(extractDestinationsFromAttachment(path)) match {
    case Success(dests) => dests
    case Failure(exception) => { log(exception); Nil }
  }
}

所有extractDestinationsFromAttachment所要做的就是抛出异常,如果失败则会显示错误消息,如果成功则抛出Seq个目的地。