Kotlin嵌套用于循环到asSequence

Kotlin嵌套用于循环到asSequence,kotlin,code-cleanup,Kotlin,Code Cleanup,我正在尝试将嵌套for循环转换为Kotlin中的asSequence。在这里,我的目标是从另一个具有相同键的对象数组中获取并更新所有对象数组的值 嵌套for循环: val myFields = getMyFields() val otherFields = getOtherFields() for (myField in myFields) { // loop tru the my fields for (otherField in otherFields) { // find th

我正在尝试将嵌套for循环转换为Kotlin中的
asSequence
。在这里,我的目标是从另一个具有相同键的对象数组中获取并更新所有对象数组的值

嵌套for循环:

val myFields = getMyFields()
val otherFields = getOtherFields()

for (myField in myFields) { // loop tru the my fields
     for (otherField in otherFields) { // find the same fields
          if (myField.key == otherField.key) { // if the same, update the value
              val updatedMyField = myField.copy(value = otherValue.value)

              myFields[myFields.indexOf(myField)] = updatedMyField // update my field value
              break
           }
      }
}
我所尝试的:

val updatedMyFields = getMyFields().asSequence()
                    .map { myField ->
                        getOtherFields().asSequence()
                            .map { otherField ->
                                if (myField.key == otherField.key) {
                                    return@map otherField.value
                                } else {
                                    return@map ""
                                }
                            }
                            .filter { it?.isNotEmpty() == true }
                            .first()?.map { myField.copy(value = it.toString()) }
                    }
                    .toList()
但这不会编译,因为它将返回
List


我只是想找一些更干净的东西来解决这个问题。

为什么要使用asSequence()?你可以这样做:

 val myFields = getMyFields()
 val otherFields = getOtherFields()

        myFields.forEach{firstField ->
            otherFields.forEach{secondField ->
                if (firstField.key == secondField.key) {
                    myFields[myFields.indexOf(firstField)] = secondField.value
                }
            }
        }

这将完成与嵌套for循环相同的工作,并且比嵌套asSequence()更易于阅读、理解和维护。

为什么要使用asSequence()?你可以这样做:

 val myFields = getMyFields()
 val otherFields = getOtherFields()

        myFields.forEach{firstField ->
            otherFields.forEach{secondField ->
                if (firstField.key == secondField.key) {
                    myFields[myFields.indexOf(firstField)] = secondField.value
                }
            }
        }

这将比嵌套的for循环做同样的工作,并且比嵌套的asSequence()更易于阅读、理解和维护。

正如注释所示,使用
映射可能会更有效

(更准确地说,映射解决方案所需的时间与列表长度之和成比例,而嵌套for循环所需的时间与其乘积成比例,后者会变得更大更快。)

这里有一种方法:

val otherFields = getOtherFields().associate{ it.key to it.value }

val myFields = getMyFields().map {
    val otherValue = otherFields[it.key]
    if (otherValue != null) it.copy(value = otherValue) else it
}
第一行从“其他字段”键创建一个映射到其值的
映射。其余的使用它从“我的字段”创建一个新列表,替换“其他字段”中存在的值

我不得不对类型&c进行假设,因为问题中的代码不完整,但这也应该如此。显然,您可以通过修改
it.copy()
来更改它合并值的方式


根据周围的代码,可能会有更简单、更有效的方法。如果您将其扩展为一个-特别是,根据您的评论,一个说明您如何使用
地图的方法-我们可能会提出更好的建议。

如评论所示,使用
映射
可能会更有效

(更准确地说,映射解决方案所需的时间与列表长度之和成比例,而嵌套for循环所需的时间与其乘积成比例,后者会变得更大更快。)

这里有一种方法:

val otherFields = getOtherFields().associate{ it.key to it.value }

val myFields = getMyFields().map {
    val otherValue = otherFields[it.key]
    if (otherValue != null) it.copy(value = otherValue) else it
}
第一行从“其他字段”键创建一个映射到其值的
映射。其余的使用它从“我的字段”创建一个新列表,替换“其他字段”中存在的值

我不得不对类型&c进行假设,因为问题中的代码不完整,但这也应该如此。显然,您可以通过修改
it.copy()
来更改它合并值的方式


根据周围的代码,可能会有更简单、更有效的方法。如果您将其扩展为一个-特别是,根据您的评论,它说明了您如何使用
地图
,我们可能会提出更好的建议。

您不认为您应该删除最后一个
.toList()
?很抱歉,我要补充一点,我也不认为我的解决方案是那么干净,如果有任何关于如何以更干净的方式进行的建议的话。你不应该使用
Map
而不是列表吗?是的,我确实使用
Map
通过键轻松交换值。我试图在上面的代码(嵌套for循环)中寻找一种更干净的方法。你不认为应该删除最后一个
.toList()
?抱歉,我只是补充一下,我也不认为我的解决方案是那么干净,也许,如果有任何关于如何以更简洁的方式进行操作的建议。你不应该使用
映射
而不是列表吗?是的,我确实使用
映射
通过键轻松交换值。我试图在上面的代码中寻找一种更干净的方法(嵌套for循环)。我认为一开始嵌套不容易阅读,这就是为什么我要寻找一些可以减少或删除它的操作符,但是,必须仍然可读。我认为一开始嵌套不容易阅读,这就是为什么我要寻找一些可以减少或删除它的操作符,但是,必须仍然可读。这是我要找的,也谢谢你的解释,我会根据我的实际需要调整:)这是我要找的,也谢谢你的解释,我会根据我的实际需要调整:)