这就是我所拥有的,也是我想要实现的:
-
我有一个类,它有一个
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
视为转换输入以获取新输出的一种方式。通常它不应该在内部改变状态,换句话说,它应该是一个没有副作用的函数来追求可维护性
在您的情况下,您显然想要改变元素,为此您可能希望使用该代码片段:
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 }
设置断点,看看过滤后是否还有剩余项目