2
我試圖如何將Iterable [Try [U]]過濾器成功轉換爲Iterable [U]?
val tryValues : Iterable[Try[Int]] = ...
val successValues = tryValues.filter(_.isSuccess).map(_.get)
但是編譯器發出警告的地圖可能會拋出異常。 有沒有免費的警告?
我試圖如何將Iterable [Try [U]]過濾器成功轉換爲Iterable [U]?
val tryValues : Iterable[Try[Int]] = ...
val successValues = tryValues.filter(_.isSuccess).map(_.get)
但是編譯器發出警告的地圖可能會拋出異常。 有沒有免費的警告?
另一個選擇,如果你不關心失敗是flatMap
在Try
使用toOption
登錄任何東西。像這樣:
val successValues = tryValues.flatMap(_.toOption)
你想使用collect
模式匹配所有的值是Success
,並放棄其他任何東西。
val successValues: List[Int] = tryValues collect { case Success(x) => x }
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)
我覺得你更優雅,也可以用在火花RDD上。 – Renkai
@Renkai你可以用同樣的方法使用'collect'與'RDD'。它也清楚表明你正在收集成功。 –