Bry*_*unt 7 monads types scala either parametric-polymorphism
我有这段代码,我只是在没有必要进行任何错误处理的测试用例中使用它.它的作用是:
代码如下:
  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)))
  }
现在,我还没有做过很多多态函数,但这很有效.不过我觉得它有点难看.有没有人有更好的建议,如何完成同样的事情.
我知道这将归结为个人偏好的情况.但欢迎提出建议.
Rex*_*err 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 }
雷克斯的答案可能会更清楚一点,但这里只是一个稍微短一些的解决方案,只需一步即可解析和"过滤":
ins.flatMap(DSJsonMapper.parseDSResult(_).right.toOption)
在这里,我们对每个解析结果进行正确的投影并将其转换为Option(None如果解析失败,则为Some(whatever)其他).由于我们正在使用flatMap,Nones不会出现在结果中,并且值会从Somes 中拉出.
| 归档时间: | 
 | 
| 查看次数: | 1161 次 | 
| 最近记录: |