You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin如何在zip两个列表时获取转换Lambda中的当前索引?

Kotlin中带索引的列表zip转换实现

Kotlin标准库没有直接提供支持在zip转换Lambda中获取索引的函数,但可以通过两种简单方式实现你需要的效果:

方法一:借助withIndex()间接实现

先对其中一个列表调用withIndex()获取带索引的元素序列,再和另一个列表zip,就能在转换逻辑中拿到当前索引:

val list1 = listOf("a", "b", "c")
val list2 = listOf("x", "y", "z")

val joined = list1.withIndex().zip(list2) { indexedItem, b ->
    listOf(indexedItem.value, b, indexedItem.index)
}

println(joined) // 输出: [[a, x, 0], [b, y, 1], [c, z, 2]]

方法二:自定义扩展函数(推荐,更贴合你的写法)

如果希望调用方式和你示例中的zipWithIndex完全一致,可以自己给Iterable扩展一个同名函数:

// 扩展Iterable,实现带索引的zip转换
fun <T, U, R> Iterable<T>.zipWithIndex(other: Iterable<U>, transform: (T, U, Int) -> R): List<R> {
    val iter1 = iterator()
    val iter2 = other.iterator()
    val result = mutableListOf<R>()
    var currentIndex = 0
    // 和标准库zip行为一致,以较短列表的长度为准
    while (iter1.hasNext() && iter2.hasNext()) {
        result.add(transform(iter1.next(), iter2.next(), currentIndex++))
    }
    return result
}

// 调用方式完全符合你的需求
val list1 = listOf("a", "b", "c")
val list2 = listOf("x", "y", "z")

val joined = list1.zipWithIndex(list2) { a, b, i ->
    listOf(a, b, i)
}

println(joined) // 输出: [[a, x, 0], [b, y, 1], [c, z, 2]]

注意事项

和标准库的zip函数逻辑一致,如果两个列表长度不同,最终结果的长度会等于较短列表的长度,超出的元素会被忽略。

内容的提问来源于stack exchange,提问作者Aleš Zrak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:35:16