如何 运行 all on a iterable with index in Kotlin

How to run all on an iterable with index in Kotlin

在 Kotlin 中,是否有函数或方法可以在使用 all 扩展时也有一个索引?

遇到这种情况:

val givenKeys = arrayOf("SHIFT", "BUILDING", "FLOOR")
val givenVals = arrayOf("NIGHT", "ALPHA", "THIRD")
val successfulMatch = mapOf(
    Pair("SHIFT", "NIGHT"), Pair("BUILDING", "ALPHA"), Pair("FLOOR", "THIRD")
)
val unsuccessfulMatch = mapOf(
    Pair("SHIFT", "NIGHT"), Pair("BUILDING", "BETA"), Pair("FLOOR", "FIRST")
)

fun isMatch(candidate: Map<String, String>, keys: Array<String>, vals: Array<String>): Boolean {
    var matches = true
    keys.forEachIndexed { i, key ->
        if(!candidate.containsKey(key) || vals[i] != candidate[key]) {
            matches = false
        }
    }
    return matches
}

isMatch(successfulMatch, givenKeys, givenVals) // returns true
isMatch(unsuccessfulMatch, givenKeys, givenVals) // returns false

我想做这样的事情

fun isMatch(candidate: Map<String, String>, keys: Array<String>, vals: Array<String>): Boolean {
    return keys.allIndex {i, key ->
        candidate.containsKey(key) && vals.any {it == candidate[key]}
    }
}

有这样的功能吗?

您可以使用 withIndex:

return keys.withIndex().all { (i, key) ->
    //...
}

请注意,它会创建一个 Iterable<IndexedValue>,因此您通常会对 lambda 参数使用取消引用运算符 ( )