我正在學習 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")
無論是val devices_list還是 ,它都失敗了var devices_list。
我只是想檢查一下我是否誤解了事情,并想確認這些是真的:
- 不變性并不意味著串列中的物件不能被修改
- 物件似乎正在更新它們的屬性就好了
- 不變性意味著串列不能更改
- 我應該無法向串列中添加另一個物件或從串列中洗掉現有物件
感謝您的時間和幫助??
uj5u.com熱心網友回復:
List不可變集合也是如此,這意味著它的內容不能改變。a 的實體List將始終包含相同的物件。
該物件List包含可以是或不是一成不變的,如果這些物件可以修改其內容,那么你可以“修改”了List; 但實際上List從未改變,因為它仍然指向相同的(可變)物件。
Aval是一個不可變的參考,當你這樣做時,val foo = x你會說它foo總是指向x物件(同樣,它可能是可變的或不可變的)。
PS:您的所有代碼都可以簡化為:
final class Devices(val devices_df: Dataset[Row],) {
lazy val devices =
devices_df
.collect()
.iterator
.map(device => device.getAs[String]("DeviceName"))
.toList
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/363989.html
下一篇:Java改變陣列物件的大小
