【问题标题】:How to convert Iterable[Try[U]] filter successed to Iterable[U]?如何将 Iterable[Try[U]] 过滤器成功转换为 Iterable[U]?
【发布时间】:2015-06-30 08:16:05
【问题描述】:

我试过了

val tryValues : Iterable[Try[Int]] = ...
val successValues = tryValues.filter(_.isSuccess).map(_.get)

但是编译器会警告 map 可能会抛出异常。 有没有什么方法可以免警告?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    以下是一种便于理解的方法

    val successValues = for { Success(n) <- tryValues } yield(p)
    

    欲了解更多信息,请查看answer

    【讨论】:

      【解决方案2】:

      这里的另一个选择是,如果您不想记录有关失败的任何信息,请在Try 上使用toOption 发送至flatMap。像这样:

      val successValues = tryValues.flatMap(_.toOption)
      

      【讨论】:

      • 我觉得你的更优雅,也可以用在 spark RDD 上。?
      • @Renkai 您可以以同样的方式将collect 与RDD 一起使用。它还清楚地表明您正在收集成功。
      【解决方案3】:

      您想使用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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 2012-01-04
        • 2021-08-24
        相关资源
        最近更新 更多