假设有个场景需要将两个列表合成一个列表
列表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方法是将循环创建对象的过程封装起来,让我们开发变得高效,但是享受高效的同时还是要了解其中的原理。