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



这就是我所拥有的,也是我想要实现的:

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

  2. 我想在该列表中找到一个特定的元素并进行更改。

这是我到目前为止尝试过的:

  1. 这是我希望能够起作用的功能语句,在我也将其放入扩展函数之后:

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

    但是,在调用此函数后,列表students似乎保持不变。

  2. 我用下面的代码找到了一个"丑陋"的解决方案:

    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 }设置断点,看看过滤后是否还有剩余项目

最新更新