Scala是一个多态函数,用于过滤 寻求更优雅的解决方案

Scala是一个多态函数,用于过滤 寻求更优雅的解决方案,scala,types,monads,either,parametric-polymorphism,Scala,Types,Monads,Either,Parametric Polymorphism,我有这段代码,我只是在不需要进行任何错误处理的测试用例中使用它。它所做的是: 获取字符串的输入列表 使用DSJSonmapper.parseDSResult方法解析它们 过滤它们并从每一个中提取右边的值(左边是一个例外) 代码如下: def parseDs(ins: List[String]) = { def filterResults[U, T](in: List[Either[U, T]]): List[T] = { in.filter(y => y.isR

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

  • 获取字符串的输入列表
  • 使用DSJSonmapper.parseDSResult方法解析它们
  • 过滤它们并从每一个中提取右边的值(左边是一个例外)
代码如下:

  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)))
  }
现在,我还没有做太多的多态函数,但这是可行的。不过我觉得有点难看。有没有人有更好的建议,如何完成同样的事情


我知道这将归结为个人偏好。但建议是受欢迎的。

收集
正是针对这种情况提出的:

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 }

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

ins.flatMap(DSJsonMapper.parseDSResult(_).right.toOption)
在这里,我们对每个解析结果进行排序,并将其转换为
选项
(如果解析失败,则为
None
,否则为
Some(无论什么)
)。由于我们使用的是
flatMap
,因此
None
s不会出现在结果中,并且会从
Some
s中提取值