Предполагая, что Map
не имеет смысла, и, как вы упомянули, сложность по времени не является проблемой, я сконцентрируюсь только на том, как можно улучшить этот код с точки зрения читабельности.
Тем не менее, я бы добавил небольшое улучшение производительности, т. Е. Вам не нужно вызывать firstList.forEach
, если второй список пуст / null
. Кроме того, так как это выглядит довольно особым случаем, я бы предпочел добавить для него функцию расширения, чтобы было еще более понятно, какой список обновляется чем, например ::
.
fun List<MyObjectX>.updateBy(other: List<MyObjectX>?) {
if (other != null && other.isNotEmpty())
forEach { thisItem ->
other.filter { relatesInSomeWayToEachOther(thisItem, it) }
.forEach { thisItem.importantProperty = it.importantProperty }
}
}
так что его использование более читабельно, я думаю, например:
val oneNullable : List<MyObjectX>? = ...
val twoNotNull : List<MyObjectX>? = ...
oneNullable?.updateBy(twoNotNull)
// or vice-versa
twoNotNull.updateBy(oneNullable)
Что касается объектов, которые должны обновляться не более одного раза, то внутренний цикл слегка изменяется:
fun List<MyObjectX>.updateOnceBy(other: List<MyObjectX>?) {
if (other != null && other.isNotEmpty()))
forEach { thisItem ->
other.firstOrNull {
relatesInSomeWayToEachOther(thisItem, it)
}?.also {
thisItem.importantProperty = it.importantProperty
}
}
}
Хорошо ... Понятно ... Я ценю читаемость на стороне вызывающей стороны выше, чем на стороне реализации; -)
Может быть, разделение поможет улучшить читаемость:
fun MyObjectX.updateBy(other: List<MyObjectX>) {
other.filter { this == it } // or if only first applies, firstOrNull again
.forEach { importantProperty = it.importantProperty }
}
fun List<MyObjectX>.updateBy(other: List<MyObjectX>?) {
if (other != null && other.isNotEmpty())
forEach {
it.updateBy(other)
}
}
Но я думаю, что что-то вроде Map
не только улучшит сложность времени, но и удобочитаемость ...