Kotlin中如何过滤Options列表,保留tags含指定gender的元素?
Kotlin 筛选包含指定Gender标签的Options列表
问题描述
需要从Options列表中筛选出tags包含指定gender(示例值为"MALE")的对象列表。现有Kotlin代码及尝试过的无效写法如下:
val gender = "MALE" val options: List<Options> = listOf( Options(id=1, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=2, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=3, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=4, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=5, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=6, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=7, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=8, tags = listOf("FEMALE", "JASMIN", "GIR")), ) // 尝试过的无效写法 options?.map{ itOptions -> itOptions.tags.filter{ it -> it == gender } } options?.forEach{ itOptions -> itOptions.tags.filter{ it -> it == gender } } options?.iterator()?.forEach { itOptions -> itOptions.tags.filter{ it -> it == gender } }
上述写法未实现预期过滤效果,期望结果为仅保留tags包含"MALE"的前4个Options对象:
val filteredOptions: List<Options> = listOf( Options(id=1, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=2, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=3, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=4, tags = listOf("MALE", "JASMIN", "GIR")) )
正确实现方式
之前的写法存在逻辑偏差:
map用于转换列表元素,会把每个Options对象转换成过滤后的tags子列表,而非保留原Options对象forEach仅遍历执行操作,不会生成新列表,对原列表无影响
正确做法是使用Kotlin集合的filter函数,直接筛选符合条件的Options对象:
val gender = "MALE" val options: List<Options> = listOf( Options(id=1, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=2, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=3, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=4, tags = listOf("MALE", "JASMIN", "GIR")), Options(id=5, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=6, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=7, tags = listOf("FEMALE", "JASMIN", "GIR")), Options(id=8, tags = listOf("FEMALE", "JASMIN", "GIR")), ) // 筛选出tags包含指定gender的Options对象 val filteredOptions = options.filter { it.tags.contains(gender) }
代码说明
filter函数遍历列表,仅保留满足it.tags.contains(gender)条件的元素it.tags.contains(gender)用于判断当前Options的tags列表是否包含目标gender值- 最终
filteredOptions即为所需的仅包含指定gender标签的Options列表
内容的提问来源于stack exchange,提问作者FlipNovid
相关产品推荐
相关产品推荐

