Scala中如何无需指定Case Class全字段复制ArrayBuffer前N个元素
解决方案
核心:利用Case Class自带的copy()方法
Scala的Case Class默认会生成一个copy()实例方法,无需指定任何字段就能直接克隆出与原实例完全相同的新对象,彻底解决你需要手动罗列所有字段的问题。
修改后的循环克隆代码
import scala.collection.mutable.ArrayBuffer case class Z(a1: String, b1: String, ts1: Integer) var d = ArrayBuffer(Z("Mark", "Hamlin", 2), Z("Kumar", "XYZ", 3), Z("Tom", "Poolsoft", 4)) var Z1 = new ArrayBuffer[Z]() for (x <- d) { Z1 += x.copy() // 直接调用copy()克隆,无需指定字段 } println(Z1)
复制前N个元素的实现
如果只需要复制前N个元素,可以结合集合的take(N)方法快速筛选目标元素后再克隆:
简洁写法(推荐)
val n = 2 // 示例:复制前2个元素 val Z1 = d.take(n).map(_.copy()) // 一行完成筛选+克隆 println(Z1)
循环写法(匹配你原有的逻辑)
val n = 2 var Z1 = new ArrayBuffer[Z]() for (x <- d.take(n)) { Z1 += x.copy() } println(Z1)
补充说明
copy()方法还支持选择性修改字段,比如克隆时需要修改某个字段,可写成x.copy(ts1 = 5),其他字段会自动沿用原实例的值,灵活性很高。- 你之前尝试的
copyToArray是集合类的方法,作用是将元素复制到数组;clone并非Scala中克隆Case Class实例的正确方式,而Case Class自带的copy()才是官方推荐的克隆手段。
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

