Kotlin有array.indexOf,但我无法弄清楚怎么做array.indexOfBy {lambda}

Jay*_*ard 6 kotlin

Kotlin array.indexOf(item)但我无法弄明白该怎么做array.indexOfBy { lambda }.它不存在吗?我可以find一个项目,但我不能同时得到它的索引.

我错过了stdlib中的函数吗?

我可以创建一个带有循环的函数,该循环可以解析项目并在找到目标时返回.像这样:

fun <T : Any> indexOfBy(items: Array<T>, predicate: (T) -> Boolean): Int {
    for (i in items.indices) { // or (i in 0..items.size-1)
        if (predicate(items[i])) {
            return i
        }
    }
    return -1
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用forEach以下功能使其更具功能性:

fun <T : Any> indexOfBy(items: Array<T>, predicate: (T) -> Boolean): Int {
    (items.indices).forEach {
        if (predicate(items[it])) {
            return it
        }
    }
    return -1
}
Run Code Online (Sandbox Code Playgroud)

或者我可以做一些像这样愚蠢的事情,这不是很有效:

val slowAndSilly = people.indexOf(people.find { it.name == "David" })
Run Code Online (Sandbox Code Playgroud)

看起来最好的可能是扩展功能:

fun <T: Any> Array<T>.indexOfBy(predicate: (T)->Boolean): Int =
        this.withIndex().find { predicate(it.value) }?.index ?: -1
fun <T: Any> Collection<T>.indexOfBy(predicate: (T)->Boolean): Int =
        this.withIndex().find { predicate(it.value) }?.index ?: -1
fun <T: Any> Sequence<T>.indexOfBy(predicate: (T)->Boolean): Int =
        this.withIndex().find { predicate(it.value) }?.index ?: -1
Run Code Online (Sandbox Code Playgroud)

是否有更优雅和惯用的方法来实现这一目标?!?对于列表,集合和序列,我也没有看到这样的函数.

(这个问题来自对另一篇文章评论)

mfu*_*n26 18

您可以使用 indexOfFirst

arrayOf(1, 2, 3).indexOfFirst { it == 2 } // returns 1
arrayOf(4, 5, 6).indexOfFirst { it < 3 } // returns -1
Run Code Online (Sandbox Code Playgroud)