为什么在一个mutableList上的.map实际上并没有改变Kotlin中List的值?

这就是我所拥有的,我想达到的目标:

  1. 我有一个类有一个mutableList作为一个字段。

  2. 我想find列表中的一个特定的元素,并改变它。

这是我迄今为止所尝试的:

  1. 这是我希望能够工作的function语句,在我将它放入扩展函数之后:

     fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .map { l -> l.name = modifiedName } .toList() } 

    但是这个函数被调用后,列表中的students似乎没有变化。

  2. 我用下面的代码find了一个“丑陋的”解决方案:

     fun Classroom.setNewParameters(id: String, modifiedName: String) { for (l : Student in this.students) { if (l.id == id) { l.name = modifiedName break } } } 

不过,我真的很想知道为什么第一块代码的行为像它一样,实际上并没有对列表产生任何影响。

您可以将map视为转换输入以获取新输出的一种方式。 通常情况下,它不应该改变内部的状态,换句话说,它应该是一个没有副作用的function来追求可维护性

在你的情况下,你显然想要变异的元素,因为你可能想要使用该代码片段:

 fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .onEach { l -> l.name = modifiedName } } 

此外,即使你使用错误的map它应该修改字段l.name (除非你已经实现了你自己的委托或getter / setter)。 尝试在this.students.filter { l -> l.id == id }上调试设置断点,并查看过滤后是否还有剩余项目

Noob在这里,但我有一天刚刚看到与此有关的东西。

是否有一个原因,你不会只是检查,看看你的数组是否包含旧值,返回元素ID,然后将新的值分配给该ID?

我想我只是指出,这可以通过“数值型”搜索来完成……但是我还是不太了解使用vs map的优缺点。

有点像这样,我从Kotlin那里得到- 用数字检查数组的方式来包含数值


数组中的“值”

这转换成Java API:

array.contains( “值”)


所以我会检查数组中的旧值,返回它的索引,然后用新值重新分配该索引。