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
相关产品推荐
相关产品推荐

