You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:36:03