#kotlin #collections
#kotlin #Коллекции
Вопрос:
Я пытаюсь отфильтровать список объектов на основе определенного условия из второго списка, а затем обновить / скопировать определенные значения из второго списка в уже отфильтрованный список.
Я попробовал это:
val filteredList = firstObjectList.stream()
.filter { first ->
secondObjectList.stream()
.anyMatch { second ->
second.sharedId == first.shareId
}
}.toList()
filteredList.map { filtered ->
secondObjectList.forEach { so ->
if(filtered.shareId == so.shareId){
val asset= Assets()
asset.address = so.address
asset.assetValue = so.assetValue
filtered.asset = asset
}
}
}
return filteredList
вот объекты:
Class firstObject(
val shareId: Int,
var asset : Asset? = null)
Class secondObject(
val shareId: Int,
var asset: Assets)
Class Assets(
val address: String,
val assetValue: Double)
Это работает, но, очевидно, не очень эффективно и основано на Java. Как я могу улучшить и написать это на идиоматическом kotlin? поскольку я, похоже, не могу правильно связать операторы. Заранее спасибо.
Ответ №1:
val map = secondObjectList.associateBy { it.shareId }
val filteredList = firstObjectList
.filter { it.shareId in map }
.onEach { fo ->
fo.asset = map.getValue(fo.shareId).asset.let { Assets(it.address, it.assetValue) }
}
Комментарии:
1. Хотя этот код может предоставить решение вопроса, лучше добавить контекст относительно того, почему / как это работает. Это может помочь будущим пользователям учиться и применять эти знания к своему собственному коду. Вы также, вероятно, получите положительные отзывы от пользователей в виде положительных голосов, когда будет объяснен код.