Scala 的不变性是否意味着列表无法修改或列表及其内容无法修改?



我正在学习Scala和函数编程及其不变性概念。

如果我的代码在这样的对象列表上运行:

class Devices(
val devices_df: Dataset[Row],
){
private lazy val _devices = _initialize_list_of_devices()
def devices(): List[Device] = {
_devices
}
private[this] def _initialize_list_of_devices(): List[Device] = {
val devices_list = ListBuffer[Device]()
for (device <- devices_df.collect()) {
devices_list += new Device(
device.getAs[String]("DeviceName"),
)
}
devices_list.toList
}
}

我初始化列表如下:

val devices_list = new Devices(devices_df).devices()

稍后,我更新列表中的对象,如下所示:

for (device <- devices_list) {
device.modify_instance_properties()
}

代码有效,我可以修改列表中的对象。

然而,当我尝试用这样的东西将另一个对象添加到列表中时:

devices_list += new Device("append another device")

无论是CCD_ 1还是CCD_。

我只是想理智地检查一下,我没有误解事情,并想确认这些是真的:

  • 不变性并不意味着列表中的对象不能修改
    • 对象似乎更新了它们的属性
  • 不变性确实意味着列表不能更改
    • 我应该无法向列表中添加另一个对象或从列表中删除现有对象

感谢您抽出时间帮助

所以List是一个不可变的集合,这意味着它的内容不能更改。List的实例将始终包含相同的对象。

List包含的对象可以是不可变的,也可以不是不可变的;修改"List;但实际上List从未改变,因为它仍然指向相同的(可变)对象。

val是一个不可变的引用,当你执行val foo = x时,你是说val devices_list0将始终指向x对象(它可能是可变的或不可变的)

PS:您的所有代码都可以简化为:

final class Devices(val devices_df: Dataset[Row],) {
lazy val devices =
devices_df
.collect()
.iterator
.map(device => device.getAs[String]("DeviceName"))
.toList
}

最新更新