为什么。可变列表上的映射不';在Kotlin中,是否实际更改列表中的值?

为什么。可变列表上的映射不';在Kotlin中,是否实际更改列表中的值?,kotlin,Kotlin,这就是我所拥有的和我想要实现的: 我有一个类,它有一个mutableList字段 我想在列表中找到一个特定的元素并对其进行更改 这就是我迄今为止所尝试的: 这是我希望能起作用的函数语句,在我将其放入扩展函数之后: fun Classroom.setNewParameters(id: String, modifiedName: String) { this.students.filter { l -> l.id == id } .map { l -&

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

  • 我有一个类,它有一个
    mutableList
    字段

  • 我想在列表中找到一个特定的元素并对其进行更改

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

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

    fun Classroom.setNewParameters(id: String, modifiedName: String) {
        this.students.filter { l -> l.id == id }
                     .map { l -> l.name = modifiedName }
                     .toList()
    }
    
    但是调用此函数后,列表
    学生
    似乎保持不变

  • 我发现了一个“丑陋”的解决方案,代码如下:

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

    您可以将
    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}
    上调试设置断点,看看在这里过滤后是否还有剩余的项目,但前几天我确实看到了一些与此相关的内容

    是否有理由不只是检查数组是否包含旧值,返回元素id,然后将新值分配给该id

    我想我只是指出,这可以通过“数组中的值”类型的搜索来实现。。。但我还是个新手,不知道使用it和map的利弊

    有点像下面这个,我从


    数组中的“值”

    这将转换为Java API:

    数组。包含(“值”)



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

    Noob这里,但前几天我确实看到了一些与此相关的内容

    是否有理由不只是检查数组是否包含旧值,返回元素id,然后将新值分配给该id

    我想我只是指出,这可以通过“数组中的值”类型的搜索来实现。。。但我还是个新手,不知道使用it和map的利弊

    有点像下面这个,我从


    数组中的“值”

    这将转换为Java API:

    数组。包含(“值”)



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

    我无法复制(但您严重滥用了map():没有理由创建一个新列表只是为了改变原始列表中的一个元素)。发布一个完整的最小程序来再现你的问题。@jbnite是的,你是对的,那完全不酷。我不知道为什么我要使用.map(实际情况稍微复杂一些,但使用.map仍然没有意义)。我在下面贴了一个很好的答案,但他删除了,不管怎样,他只是告诉我和
    学生一起去!你认为这也是一个好的解决方案吗?不。我认为你应该使用
    list.find{it.id==id}?.name=modifiedName
    。这与您的第二个代码片段相匹配:找到具有给定id的第一个元素,并更改其名称。@JBNizet如果需要更新多个值,如何应用您的解决方案?i、 我需要同时编辑姓名和姓氏吗?除了多次重复查找操作(我想这是很糟糕的)
    list.find{it.id==id}?.apply{name=modifiedName;姓氏=modifiedSurname}
    我无法重现(但您严重滥用了map():没有理由创建一个新的列表,只是为了改变原始列表中的一个元素). . 发布一个完整的最小程序来再现你的问题。@jbnite是的,你是对的,那完全不酷。我不知道为什么我要使用.map(实际情况稍微复杂一些,但使用.map仍然没有意义)。我在下面贴了一个很好的答案,但他删除了,不管怎样,他只是告诉我和
    学生一起去!你认为这也是一个好的解决方案吗?不。我认为你应该使用
    list.find{it.id==id}?.name=modifiedName
    。这与您的第二个代码片段相匹配:找到具有给定id的第一个元素,并更改其名称。@JBNizet如果需要更新多个值,如何应用您的解决方案?i、 我需要同时编辑姓名和姓氏吗?除了多次重复查找操作(我想这很糟糕)
    list.find{it.id==id}?.apply{name=modifiedName;name=modifiedSurname}