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

