首页 > 解决方案 > 在列表中搜索项目 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

解决方案


使用 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包中了解所有这些谓词。


推荐阅读