kotlin - 优化 for 循环以将项目添加到 map

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/

相关文章:

python - 我如何拆分第二个 ", "

c - 在 C 程序中使用汇编函数

c++ - 声明属于所有特化的类模板成员

vue.js - Nuxt : how can I get sourcemap files and

javascript - 将存储为 String 的 Array 转换为 Java String 中

awk - 根据列将大文件拆分为多个文件

r - 在避免循环的同时计算 "smaller"行数比其他行数

sql - Postgres - 使用 postgis 计算距离

snowflake-cloud-data-platform - 雪花 : How do I upda

javascript - 在 Vue 组件中加载 HTML 文件内容