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

时间:2017-10-21 11:37:23

标签: kotlin

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

  1. 我有一个以mutableList为字段的课程。

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

  3. 这是我到目前为止所尝试的:

    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
              }
          }
      }
      
    3. 仍然如此,我真的很想知道为什么第一个代码块就像它一样,并且实际上对列表没有任何影响。

2 个答案:

答案 0 :(得分:0)

您可以将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 }上调试set breakpoint并查看过滤后是否还有任何项目

答案 1 :(得分:0)

Noob在这里,但我前几天才看到与此有关的事情。

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

我想我只是指出这可以通过数组中的"值来实现"键入搜索...但我仍然太新,不知道使用它与地图的利弊。

下面是这样的,我是从Kotlin - Idiomatic way to check array contains value

获得的

"值"在数组中

转换为Java API:

array.contains("值&#34)

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