Kotlin Iterable.zip操作符使用记录

作用

假设有个场景需要将两个列表合成一个列表

列表1[1,2,3]
列表2["a", "b", "c"]
期望结果:
[(1, a), (2, b), (3, c)]

如果用java,最先想到的是遍历列表,循环往新列表插入新对象,但是项目该模块是kotlin的,发现有个很方便的方法。

private val list1 = mutableListOf(1, 2, 3)
private val list2 = mutableListOf("a", "b", "c")
val newList = list1.zip(list2)//newList为[(1, a), (2, b), (3, c)]

原理

其中zip是Iterable的扩展方法,它参数为另外一个迭代器,返回时List是个list

public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>> {
    return zip(other) { t1, t2 -> t1 to t2 }//最后一个参数为函数方法
}

看下重载的zip方法

public inline fun <T, R, V> Iterable<T>.zip(other: Iterable<R>, transform: (a: T, b: R) -> V): List<V> {
    val first = iterator()
    val second = other.iterator()
    val list = ArrayList<V>(minOf(collectionSizeOrDefault(10), other.collectionSizeOrDefault(10)))//取最小的列表数量
    while (first.hasNext() && second.hasNext()) {//成对才添加进新列表
        list.add(transform(first.next(), second.next()))//将两个数组的子元素转换成Pair元组
    }
    return list
}

其中transform是方法参数

{ t1, t2 -> t1 to t2 }

其中to是顶层扩展函数,在Tuples中

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

返回的是一个Pair,其中Pair是kotlin的二元元组,可以理解为两个参数的bean

总结

其实zip方法是将循环创建对象的过程封装起来,让我们开发变得高效,但是享受高效的同时还是要了解其中的原理。

你可能感兴趣的:(kotlin,kotlin,android,java)