2-2-31 快速掌握Kotlin-合并函数zip

31 阅读1分钟

在 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]

注意事项

  1. 长度处理zip 会以较短的集合为准
  2. 性能:对于小集合直接使用,大集合考虑使用序列
  3. 空安全:两个集合都可以为空,结果为空列表

常见用例

// 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 集合操作中非常实用的函数,特别适合需要并行处理多个相关数据源的场景。