这就是我拥有的和我想要实现的目标:
我有一个以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
}
}
}
仍然如此,我真的很想知道为什么第一个代码块就像它一样,并且实际上对列表没有任何影响。
答案 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)
所以我要检查数组中的旧值,返回它的索引,然后用新值重新分配该索引。