解析并替换kotlin中的对象列表

时间:2018-03-21 19:46:45

标签: list foreach kotlin

我目前有一个定义为:

的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字段从toolsupdateTools

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,我觉得这不是一个好方法 任何想法?

由于

2 个答案:

答案 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命名参数,而不是为变量赋值,而是在循环的其余部分使用它。