Groovy的findIndexValues方法是否存在对应的Kotlin等效实现?
Kotlin标准库没有提供和Groovy的findIndexValues完全同名的内置方法,但可以通过现有标准库函数非常简便地实现同等效果,不需要手动遍历列表收集索引。
原生实现方式(无需自定义扩展)
有两种常用的简洁写法:
- 搭配
withIndex()拆分索引与元素后过滤
val list = listOf("a", "b", "c", "b") // 筛选出所有值为"b"的元素索引 val targetIndices = list.withIndex() .filter { it.value == "b" } .map { it.index } // 执行结果为 [1, 3]
- 用
mapIndexedNotNull直接返回匹配的索引,写法更精简
val targetIndices = list.mapIndexedNotNull { index, value -> // 匹配时返回索引,不匹配时返回null,最终结果会自动过滤掉null值 if (value == "b") index else null }
封装为通用扩展函数
如果需要和GroovyfindIndexValues一致的调用体验,可以把逻辑封装为扩展函数,适配所有可迭代集合,比示例中仅支持List的版本适用范围更广:
fun <T> Iterable<T>.findIndexValues(predicate: (T) -> Boolean): List<Int> = mapIndexedNotNull { index, element -> index.takeIf { predicate(element) } }
调用示例:
val indices = listOf(1,2,3,4,5).findIndexValues { it % 2 == 0 } // 执行结果为 [1, 3]
内容的提问来源于stack exchange,提问作者Marcel Overdijk
相关产品推荐
相关产品推荐

