在 Kotlin 中,zip 函数用于将两个集合合并成一个新的配对(Pair)列表。以下是详细说明和示例:
基本用法
1. 基础 zip 函数
val list1 = listOf("A", "B", "C")
val list2 = listOf(1, 2, 3)
val result = list1.zip(list2)
// 结果:[(A, 1), (B, 2), (C, 3)]
2. 不同长度的集合
val list1 = listOf("A", "B", "C", "D")
val list2 = listOf(1, 2, 3)
val result = list1.zip(list2)
// 结果:[(A, 1), (B, 2), (C, 3)]
// 只取到较短集合的长度
高级用法
3. 使用转换函数
val list1 = listOf("A", "B", "C")
val list2 = listOf(1, 2, 3)
val result = list1.zip(list2) { a, b ->
"$a$b"
}
// 结果:[A1, B2, C3]
4. 解构配对
val pairs = list1.zip(list2)
pairs.forEach { (letter, number) ->
println("$letter -> $number")
}
// 输出:
// A -> 1
// B -> 2
// C -> 3
实际应用示例
示例 1:合并姓名和分数
val names = listOf("Alice", "Bob", "Charlie")
val scores = listOf(95, 87, 92)
val nameScorePairs = names.zip(scores)
// [(Alice, 95), (Bob, 87), (Charlie, 92)]
示例 2:创建映射
val keys = listOf("id", "name", "age")
val values = listOf(1, "Alice", 25)
val map = keys.zip(values).toMap()
// 结果:{id=1, name=Alice, age=25}
示例 3:处理不同长度
val fruits = listOf("Apple", "Banana", "Cherry", "Date")
val prices = listOf(1.2, 0.8, 2.5)
val inventory = fruits.zip(prices) { fruit, price ->
"$fruit: $${price}"
}
// 结果:[Apple: $1.2, Banana: $0.8, Cherry: $2.5]
示例 4:与 zipWithNext 比较
val list = listOf(1, 2, 3, 4, 5)
val zipped = list.zip(list.drop(1))
// [(1, 2), (2, 3), (3, 4), (4, 5)]
val withNext = list.zipWithNext()
// 同上,更简洁
特殊变体
5. zipWithNext
val numbers = listOf(1, 2, 3, 4)
val pairs = numbers.zipWithNext()
// [(1, 2), (2, 3), (3, 4)]
6. 使用序列(Sequence)
val seq1 = sequenceOf("A", "B", "C")
val seq2 = sequenceOf(1, 2, 3)
val result = seq1.zip(seq2).toList()
// 惰性计算,适合大数据集
自定义 zip 实现
如果需要特殊逻辑,也可以自己实现:
fun <T, R, V> List<T>.customZip(
other: List<R>,
transform: (T, R) -> V
): List<V> {
val size = minOf(this.size, other.size)
return List(size) { i ->
transform(this[i], other[i])
}
}
// 使用
val result = listOf(1, 2, 3).customZip(listOf("a", "b", "c")) { num, char ->
"$num$char"
}
// [1a, 2b, 3c]
注意事项
- 长度处理:
zip会以较短的集合为准 - 性能:对于小集合直接使用,大集合考虑使用序列
- 空安全:两个集合都可以为空,结果为空列表
常见用例
// 1. 并行处理两个列表
val actions = listOf("view", "click", "purchase")
val counts = listOf(100, 20, 5)
val analytics = actions.zip(counts).map { (action, count) ->
"${action}: $count times"
}
// 2. 构建复合键
val firstNames = listOf("John", "Jane")
val lastNames = listOf("Doe", "Smith")
val fullNames = firstNames.zip(lastNames) { first, last ->
"$first $last"
}
zip 是 Kotlin 集合操作中非常实用的函数,特别适合需要并行处理多个相关数据源的场景。