我在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]
但我相信它可以使它更简单/更具可读性吗?
答案 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
个目的地。