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

Kotlin标准库是否支持3个及以上列表的zip迭代操作?

Kotlin中多列表Zip的实现方式

嘿,这个问题问得很到位!首先明确说:Kotlin标准库并没有提供直接支持3个或更多列表的原生zip函数,但我们有几种优雅的方式实现和你给出的代码等价的效果,甚至比嵌套zip更顺手。

方式一:嵌套Zip+解构(和你写的逻辑一致)

你给出的代码已经是可行的方案,其实还可以简化写法,用Triple代替listOf(如果不需要列表形式的话,用数据类会更清晰):

val zipped = list1.zip(list2).zip(list3) { (a, b), c -> Triple(a, b, c) }

这种写法完全遵循标准库的现有API,不需要额外代码,唯一的小缺点是列表越多,嵌套层级会越明显,可读性会略有下降。

方式二:自定义扩展函数(推荐)

既然标准库没提供,我们可以自己写一个和原生zip风格一致的扩展函数,轻松支持3个甚至更多列表:

// 针对3个列表的zip扩展
fun <T1, T2, T3, R> Iterable<T1>.zip(
    other1: Iterable<T2>,
    other2: Iterable<T3>,
    transform: (T1, T2, T3) -> R
): List<R> {
    val iter1 = iterator()
    val iter2 = other1.iterator()
    val iter3 = other2.iterator()
    val result = mutableListOf<R>()
    // 和原生zip行为一致:以最短的列表为准,耗尽即停止遍历
    while (iter1.hasNext() && iter2.hasNext() && iter3.hasNext()) {
        result.add(transform(iter1.next(), iter2.next(), iter3.next()))
    }
    return result
}

有了这个扩展,调用起来就和原生双列表zip一样直观:

val zipped = list1.zip(list2, list3) { a, b, c -> listOf(a, b, c) }

如果需要支持更多列表(比如4个、5个),只需要按照同样的逻辑扩展参数和迭代器判断即可。

额外说明

不管用哪种方式,最终的行为都和原生zip保持一致:遍历会在最短的列表耗尽时停止,多余的元素会被自动忽略。

内容的提问来源于stack exchange,提问作者voddan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:21:22