如何将Iterable [Try [U]]过滤器成功转换为Iterable [U]?

Ren*_*kai 2 scala apache-spark

我试过了

val tryValues : Iterable[Try[Int]] = ...
val successValues = tryValues.filter(_.isSuccess).map(_.get)
Run Code Online (Sandbox Code Playgroud)

但编译器会发出警告,表示map可能会抛出异常 有什么办法没有警告吗?

Mic*_*jac 7

您希望使用collect模式匹配所有值Success,并丢弃其他任何值.

val successValues: List[Int] = tryValues collect { case Success(x) => x }
Run Code Online (Sandbox Code Playgroud)

collect接受一个PartialFunction作为参数.PartialFunction将映射定义的集合中的任何值,其余值将被丢弃.

例:

scala> val tryValues = List(1, 1, 0, 1, 1).map(x => Try(1 / x)) 
tryValues: List[scala.util.Try[Int]] = List(Success(1), Success(1), Failure(java.lang.ArithmeticException: / by zero), Success(1), Success(1))

scala> val successValues = tryValues collect { case Success(x) => x }
successValues: List[Int] = List(1, 1, 1, 1)
Run Code Online (Sandbox Code Playgroud)