7

寻求更优雅的解决方案

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

  • 获取字符串的输入列表
  • 使用 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)))
  }

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

我知道这将归结为个人喜好。但欢迎提出建议。

4

2 回答 2

11

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 }
于 2012-08-08T16:00:28.753 回答
7

Rex 的答案可能更清楚一些,但这里有一个更短的替代方案,它可以在一个步骤中解析和“过滤”:

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

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

于 2012-08-08T16:20:40.850 回答