Kotlin是否存在谓词支持传入位置参数的findFirst类函数?
Kotlin 标准库相关能力说明
Kotlin 标准库没有直接提供签名完全匹配你预期调用形式的内置函数,但可以通过两种非常简单的方式实现完全一致的效果:
- 直接使用标准库现有组合能力,无需额外封装:借助
withIndex()将原始列表包装为携带元素索引的IndexedValue序列,再配合firstOrNull()(别名find())即可实现带索引条件的查找,示例代码如下:
// 仅获取匹配到的元素本身 val targetItem = list.withIndex().firstOrNull { (index, item) -> index > 19 && item.active }?.value // 如果需要同时拿到匹配元素和它的索引,直接保留IndexedValue结果即可 val indexedResult = list.withIndex().firstOrNull { (index, item) -> index > 19 && item.active } // indexedResult?.index 就是匹配位置,indexedResult?.value 就是匹配元素
这里的解构写法参数顺序、逻辑判断形式和你预期的写法几乎完全一致,不需要引入任何额外依赖。
- 如果你希望严格按照你写的
findXXX形式调用,只需要自己实现一个极短的通用扩展函数即可,代码如下:
inline fun <T> Iterable<T>.findIndexed( predicate: (index: Int, item: T) -> Boolean ): T? { forEachIndexed { index, item -> if (predicate(index, item)) return item } return null }
定义完这个扩展后,就可以完全按照你期望的写法直接调用:
val result = list.findIndexed { index, item -> index > 19 && item.active }
补充:如果需要查找最后一个符合条件的元素,要么用
withIndex().lastOrNull(),要么参照上面的扩展自行实现findLastIndexed即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者RusArtM
相关产品推荐
相关产品推荐

