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

Scala中将case class列表转换为另一case class列表的优雅实现方案

方案1:单次转换用模式匹配(可读性更高)

如果你只需要做这一次转换,用模式匹配的写法比直接点属性更清晰,字段多的时候优势更明显:

val res: List[student2] = mylist.map {
  case student1(name, marks) => student2(name, marks)
}

这种写法不需要手动访问对象属性,字段多的时候不容易写错,可读性更好。


方案2:多次转换用扩展方法(复用性最高)

如果你需要在代码多处做student1到student2的转换,建议封装转换方法,后续调用会非常简洁。

Scala 3 写法:

// 定义一次即可全局使用
extension (s: student1)
  def toStudent2: student2 = student2(s.name, s.marks)

// 转换时直接调用
val res: List[student2] = mylist.map(_.toStudent2)

Scala 2 写法:

implicit class Student1Ops(private val s: student1) extends AnyVal {
  def toStudent2: student2 = student2(s.name, s.marks)
}

// 转换代码和上面一致
val res: List[student2] = mylist.map(_.toStudent2)

补充说明

你原本的写法已经是基础的正确实现,上面两种方案分别对应单次转换提升可读性、多次转换提升复用性和简洁度的场景,可以根据实际使用情况选择。

还有一种利用样例类实现Product特质的写法:

val res: List[student2] = mylist.map(s => student2.tupled(Tuple.fromProduct(s).asInstanceOf[(String, Long)]))

但这种写法依赖两个样例类的字段顺序、类型完全对齐,没有编译期检查,可读性也差,不推荐日常使用。

内容的提问来源于stack exchange,提问作者CoolGoose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:24:03