Scala如何对Seq[Either]仅映射Right值同时输出Left的错误信息
正确实现方式
你原来的写法报错是因为flatMap要求传入的函数返回Iterable类型,而println返回Unit不符合要求,调整分支返回值即可,有几种常用实现方案:
方案1:基于flatMap直接实现
val data: Seq[Data] = l.flatMap { case Right(data) => Some(data) case Left(err) => println(err) None }
这里Some和None属于Option类型,Scala会自动将Option隐式转换为可迭代的集合类型,满足flatMap的参数要求。
方案2:逻辑拆分实现(可读性更高)
如果希望把打印错误的副作用和纯数据提取逻辑拆分,写法更清晰:
// 第一步:处理错误打印 l.foreach { case Left(err) => println(err) case _ => } // 第二步:提取所有Right值 val data: Seq[Data] = l.collect { case Right(data) => data }
方案3:单遍历实现(大序列性能更优)
如果只希望遍历序列一次就完成两个操作,可以用foldLeft:
val data: Seq[Data] = l.foldLeft(Seq.empty[Data]) { (acc, either) => either match { case Right(data) => acc :+ data case Left(err) => println(err) acc } }
内容的提问来源于stack exchange,提问作者K D
相关产品推荐
相关产品推荐

