Как мне фильтровать и копировать значения в список объектов на основе другого списка в Kotlin

#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. Хотя этот код может предоставить решение вопроса, лучше добавить контекст относительно того, почему / как это работает. Это может помочь будущим пользователям учиться и применять эти знания к своему собственному коду. Вы также, вероятно, получите положительные отзывы от пользователей в виде положительных голосов, когда будет объяснен код.