Kotlin 1.5.42
我有以下数据类,我需要过滤掉级别 2 和级别 3 的值。然后我使用 for..loop 循环遍历 level2 并检查 level3 是否有 parentId
匹配 level2 value
哪个被添加到列表中。当该 level3 循环完成时,我将键添加到 map 中,键是 level2 对象,值是 level3 的列表。
即
Map<TopsProductFilterItem, List<TopsProductFilterItem>>
我一直在寻找一个更好的解决方案,它使用 kotlin 更简洁,并寻找 associateBy 或 assoicateWith 是否有帮助。
data class TopsProductFilterItem(
val value: String = "",
val catalogSearchCustomAttribute: CatalogSearchCustomAttribute = CatalogSearchCustomAttribute(),
)
以及以下具有级别的数据类
data class CatalogSearchCustomAttribute(
val level: Int = 0,
val parentId: Int = 0)
由于可以为他的类(class)分配很多级别,我只对级别 2 和级别 3 感兴趣。所以我将它们过滤掉如下。
private fun createMapOfLevelCategories(listOfTopsProductFilterItem: List<TopsProductFilterItem>) {
val listOfLevel2 = listOfTopsProductFilterItem.filter { topsProductFilterItem ->
topsProductFilterItem.catalogSearchCustomAttribute.level == 2
}
val listOfLevel3 = listOfTopsProductFilterItem.filter { topsProductFilterItem ->
topsProductFilterItem.catalogSearchCustomAttribute.level == 3
}
val mapOfCategoryLevel2 = mutableMapOf<TopsProductFilterItem, List<TopsProductFilterItem>>()
listOfLevel2.forEach { categoryLevel2 ->
/* Find the parent id in the level 3 and from the level 2 value */
val listOfCategoryLevel3 = mutableListOf<TopsProductFilterItem>()
listOfLevel3.forEach { categoryLevel3 ->
if(categoryLevel2.value.toInt() == categoryLevel3.catalogSearchCustomAttribute.parentId) {
/* found a matching parent ID and value */
listOfCategoryLevel3.add(categoryLevel3)
}
}
mapOfCategoryLevel2.put(categoryLevel2, listOfCategoryLevel3)
}
}
最佳答案
您可以执行 listOfLevel2.associateWith { ... }
。 associatedWith
使用与调用它的可迭代对象相同的键创建映射,但允许您指定希望如何转换每个键的关联值。在这种情况下,我们希望值是第 3 级列表中具有等于键的 value.toInt()
的 parentId
的所有项目。
listOfLevel2.associateWith { level2 ->
listOfLevel3.filter { level3 ->
level2.value.toInt() == level3.catalogSearchCustomAttribute.parentId
}
}
更好的是,您可以先对 3 级父 ID 执行 groupBy
,然后您不必在 listOfLevel3
中一遍又一遍地循环关联
:
listOfLevel3.groupBy { it.catalogSearchCustomAttribute.parentId }.let { parentIdGroups ->
listOfLevel2.associateWith { level2 ->
parentIdGroups[level2.value.toInt()] ?: emptyList()
}
}
https://stackoverflow.com/questions/69204137/