【问题标题】:Scala polymorphic function for filtering an input List of Either用于过滤输入列表的 Scala 多态函数
【发布时间】:2012-08-05 18:59:26
【问题描述】:

寻求更优雅的解决方案

我有这段代码,我只是在不需要进行任何错误处理的测试用例中使用它。它的作用是:

  • 获取字符串的输入列表
  • 使用 DSJSonmapper.parseDSResult 方法解析它们
  • 过滤它们并从每个 Either 中提取 Right 值(Left 是一个例外)

代码如下:

  def parseDs(ins: List[String]) = {
    def filterResults[U, T](in: List[Either[U, T]]): List[T] = {
      in.filter(y => y.isRight).map(z => z.right.get)
    }
    filterResults(ins.map(x => DSJsonMapper.parseDSResult(x)))
  }

现在,我还没有完成很多多态函数,但这是可行的。不过我觉得有点丑。有没有人有更好的建议,如何完成同样的事情。

我知道这将取决于个人喜好。但欢迎提出建议。

【问题讨论】:

    标签: scala types monads either parametric-polymorphism


    【解决方案1】:

    collect 就是为这种情况而生的:

    def filterMe[U,T](in: List[Either[U,T]]): List[T] = in.collect{
      case Right(r) => r
    }
    

    事实上,它非常擅长这一点,您可能想跳过def 而只是

    ins.map(DSJsonMapper.parseDsResult).collect{ case Right(r) => r }
    

    【讨论】:

      【解决方案2】:

      Rex 的答案可能更清楚一些,但这里有一个更短的替代方案,只需一步即可解析和“过滤”:

      ins.flatMap(DSJsonMapper.parseDSResult(_).right.toOption)
      

      在这里,我们将每个解析结果的right projection 转换为Option(如果解析失败,则为None,否则为Some(whatever))。由于我们使用的是flatMap,因此Nones 不会出现在结果中,并且值会从Somes 中提取出来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2022-11-14
        • 2021-02-09
        • 2021-12-25
        • 1970-01-01
        • 2020-03-09
        • 1970-01-01
        相关资源
        最近更新 更多