kotlin - 在列表中搜索项目 Kotlin
问题描述
我有以下数据类类别:
data class Category(
val id: Int = DEFAULT_ID,
val name: String = "",
val picture: String = "",
val subcategories: List<Category> = listOf()
)
我正在构建一个函数,它需要一个 id 列表,如果列表包含这些 id,则需要在类别列表中搜索。如果它包含 id,我需要将 Category 保存在 categoryListResult 中。
这就是我编写它的方式,并且它有效,但我不确定这是否是在 Kotlin 中最有效的方式。
private fun getPopCategories(listOfIds : MutableList<Int>) {
val categoryListResult = mutableListOf<Category>()
getCategories.execute(
onSuccess = { categories -> categories.forEach{ category ->
if (listOfIds.contains(category.id)) categoryListResult.add(category)
if (category.hasSubcategories()) {
category.subcategories.forEach { subcategory ->
if (listOfIds.contains(subcategory.id)) categoryListResult.add(subcategory)
}
}
}
}
)
}
解决方案
使用 kotlin 的谓词find
得到 ONE。
listOf("Hello", "Henry", "Alabama).find { it.startsWith("He") }
// Returns the first match of the list
如果您希望所有这些都符合某个条件,请使用 filter
listOf("Hello", "Henry", "Alabama).filter { it.startsWith("He") }
// Returns "Hello" and "Henry"
因此,在您的情况下,理想的做法是获取类别的平面列表(包括您的子类别;为此,我建议使用flatMap, flatten
或类似的谓词。
// This way you just have an entire List<Category>
// This is a naive approach that assumes that subcategories won't have subcategories
val allCategories = categories.flatMap { cat -> listOf(cat) + cat.subcategories.orEmpty()
}
最后做
allCategories.filter { cat -> cat.id in listOfIds }
您可以在kotlin.collections包中了解所有这些谓词。
推荐阅读
- selenium - 如何通过 Selenium 识别特定的 Page Object 片段成员元素
- powershell - 如何在给定用户名的情况下获取文件所有者的显示全名(Powershell)
- java - 是否可以在不遵循继承链的 Java 类中提供 @AfterXXX TestNG 注释?
- boost - 在构建 Field3D 时,如何确定链接到 Boost 线程组件的静态库的位置?
- jquery - 使用 jquery 进行百分比验证
- python - 如何创建一个包含列的所有组合的数据框?pandas python?
- microsoft-cognitive - LUIS batch testing
- python - 在 Paramiko 中使用 exec_command 实时输出 wget 命令
- python - 欧拉计划 11 Pyth0n
- ubuntu - 如何在 Ubuntu Xenial 16.04.4 上获取 Mono 3.5