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
相关产品推荐
相关产品推荐

