这是我有什么,我想要实现:为什么在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 *元素,然后改变它的名字。 –