我目前有一个定义为:
的obeject列表fun updateList(tools: List<Tool>, updateTools: List<Updated>){
... code below
}
Tool
数据类定义为:
data class Tool(
var id: String = ""
var description: String = ""
var assignedTo: String = ""
)
Updated
数据类定义为:
data class Updated(
var id: String = ""
var assignedTo: String = ""
)
基本上,我解析了列表updateTools
,如果我在id
中找到tools
匹配,我会更新assignedTo
类型对象中的Tool
字段从tools
到updateTools
fun updateList(tools: List<Tool>, updateTools: List<Updated>){
updateTools.forEach{
val idToSearch = it.id
val nameToReplace = it.name
tools.find(){
if(it.id == idToSearch){it.name=nameToReplace}
}
}
return tools
}
它没有工作,但我不知道如何让它更容易工作。我刚刚开始kotlin,我觉得这不是一个好方法 任何想法?
由于
答案 0 :(得分:1)
首先:
assignedTo
,您正在分配name
... find
的谓词中的Boolean
值,forEach
来完成。此外,数据类的构造函数参数是普通参数,因此,它们之间需要逗号!
您的最后一个代码块已更正:
updateTools.forEach {
val idToSearch = it.id
val nameToReplace = it.name
tools.find { it.id == idToSearch }.forEach { it.assignedTo = nameToReplace }
}
return tools
我这样做(更短):
updateTools.forEach { u -> tools.filter { it.id == u.id }.forEach { it.assignedTo = u.name } }
这会遍历每次更新,过滤tools
以获取具有正确ID的工具,并设置每个工具的名称。
我使用forEach
,因为filter
会返回List<Tool>
。
如果您可以保证id
是唯一的,那么您可以这样做:
updateTools.forEach { u -> tools.find { it.id == u.id }?.assignedTo = u.name }
编辑:似乎firstOrNull
返回与条件匹配的第一个元素,如果没有,则返回null
。find
firstOrNull
- 其实现仅调用firstOrNull
。
如果左操作数为?.
,则null
安全调用操作符返回null
,否则调用该方法。
对于=
和其他返回Unit
的运算符(即void
,没有任何内容),如果左操作数为空,则使用安全调用运算符不会执行任何操作。
如果我们将它们组合在一起,它会有效地设置匹配此条件的第一个元素的名称。
答案 1 :(得分:0)
首先,您在数据类中的属性之后缺少逗号,因此它应该是:
data class Tool(
var id: String = "",
var description: String = "",
var assignedTo: String = ""
)
data class Updated(
var id: String = "",
var assignedTo: String = ""
)
关于第二个问题,可能有很多方法可以做到这一点,但我只是纠正了你的想法:
fun updateList(tools: List<Tool>, updateTools: List<Updated>): List<Tool> {
updateTools.forEach{ ut ->
tools.find { it.id == ut.id }?.assignedTo = ut.assignedTo
}
return tools
}
您可以为forEach
命名参数,而不是为变量赋值,而是在循环的其余部分使用它。