這是我有什麼,我想要實現:爲什麼在mutableList上的.map實際上並沒有改變Kotlin中List的值?
我有具有
mutableList
作爲現場的一類。我想找到該列表中的特定元素並進行更改。
這是我到目前爲止已經試過:
這是我希望的功能的語句會工作,之後我也把它放在一個擴展功能:
fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .map { l -> l.name = modifiedName } .toList() }
但是在調用該函數後,列表
students
看起來沒有改變。我發現下面的代碼的「醜陋」的解決方案:
fun Classroom.setNewParameters(id: String, modifiedName: String) { for (l : Student in this.students) { if (l.id == id) { l.name = modifiedName break } } }
不過壽,我真的很想知道爲什麼第一個代碼塊的行爲就像它沒有按和」實際上對列表有任何影響。
我無法重現(但是你嚴重濫用map():沒有理由創建一個新列表來改變原始列表中的一個元素)。 https://gist.github.com/jnizet/a25b87ff33ca156f446adbc8d6548bac。發佈完整的最小程序來重現您的問題。 –
@JBNizet是的,你是對的,那完全不是很酷。我不知道爲什麼我被困在.map中(真實情況稍微複雜一點,但仍然沒有意義使用.map)。我在下面發佈了一個很好的答案,但他刪除了它,無論如何他只是告訴我去'students.forEach({if(it.id == id)it.name = modifiedName})'這似乎工作得很好!你認爲這是一個好的解決方案嗎? –
不,我想你應該使用'list.find {it.id == id} ?. name = modifiedName'。這就是匹配你的第二個代碼片段:用給定的id找到* first *元素,然後改變它的名字。 –