编程语言
528
zip(other: Iterable<R>): List<Pair<T, R>>
两个集合按照下标配对,组合成的每个Pair作为新的List集合中的元素,并返回。
如果两个集合长度不一样,取短的长度。
代码示例
>>> val list1 = listOf(1,2,3) >>> val list2 = listOf(4,5,6,7) >>> val list3 = listOf("x","y","z") >>> list1.zip(list3) [(1, x), (2, y), (3, z)] >>> list3.zip(list1) [(x, 1), (y, 2), (z, 3)] >>> list2.zip(list3) [(4, x), (5, y), (6, z)] // 取短的长度 >>> list3.zip(list2) [(x, 4), (y, 5), (z, 6)] >>> list1.zip(listOf<Int>()) []
这个zip函数的定义如下:
public infix fun <T, R> Iterable<T>.zip(other: Iterable<R>): List<Pair<T, R>> { return zip(other) { t1, t2 -> t1 to t2 } }
我们可以看出,其内部是调用了zip(other) { t1, t2 -> t1 to t2 }
。这个函数定义如下:
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())) } return list }
依次取两个集合相同索引的元素,使用提供的转换函数transform得到映射之后的值,作为元素组成一个新的List,并返回该List。列表的长度取两个集合中最短的。
代码示例
>>> val list1 = listOf(1,2,3) >>> val list2 = listOf(4,5,6,7) >>> val list3 = listOf("x","y","z") >>> list1.zip(list3, {t1,t2 -> t2+t1}) [x1, y2, z3] >>> list1.zip(list2, {t1,t2 -> t1*t2}) [4, 10, 18]
unzip(): Pair<List<T>, List<R>>
首先这个函数作用在元素是Pair的集合类上。依次取各个Pair元素的first, second值,分别放到List<T>、List<R>中,然后返回一个first为List<T>,second为List<R>的大的Pair。
函数定义
public fun <T, R> Iterable<Pair<T, R>>.unzip(): Pair<List<T>, List<R>> { val expectedSize = collectionSizeOrDefault(10) val listT = ArrayList<T>(expectedSize) val listR = ArrayList<R>(expectedSize) for (pair in this) { listT.add(pair.first) listR.add(pair.second) } return listT to listR }
看到这里,仍然有点抽象,我们直接看代码示例:
>>> val listPair = listOf(Pair(1,2),Pair(3,4),Pair(5,6)) >>> listPair [(1, 2), (3, 4), (5, 6)] >>> listPair.unzip() ([1, 3, 5], [2, 4, 6])
partition(predicate: (T) -> Boolean): Pair<List<T>, List<T>>
根据判断条件是否成立,将集合拆分成两个子集合组成的 Pair。我们可以直接看函数的定义来更加清晰的理解这个函数的功能:
public inline fun <T> Iterable<T>.partition(predicate: (T) -> Boolean): Pair<List<T>, List<T>> { val first = ArrayList<T>() val second = ArrayList<T>() for (element in this) { if (predicate(element)) { first.add(element) } else { second.add(element) } } return Pair(first, second) }
我们可以看出,这是一个内联函数。
代码示例
>>> val list = listOf(1,2,3,4,5,6,7,8,9) >>> list [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list.partition({it>5}) ([6, 7, 8, 9], [1, 2, 3, 4, 5])
plus(elements: Iterable<T>): List<T>
合并两个List。
函数定义
public operator fun <T> Iterable<T>.plus(elements: Iterable<T>): List<T> { if (this is Collection) return this.plus(elements) val result = ArrayList<T>() result.addAll(this) result.addAll(elements) return result }
我们可以看出,这是一个操作符函数。可以用”+”替代 。
代码示例
>>> val list1 = listOf(1,2,3) >>> val list2 = listOf(4,5) >>> list1.plus(list2) [1, 2, 3, 4, 5] >>> list1+list2 [1, 2, 3, 4, 5]
关于plus函数还有以下的重载函数:
plus(element: T): List<T> plus(elements: Array<out T>): List<T> plus(elements: Sequence<T>): List<T>
等。
plusElement(element: T): List<T>
在集合中添加一个元素。 函数定义
@kotlin.internal.InlineOnly public inline fun <T> Iterable<T>.plusElement(element: T): List<T> { return plus(element) }
我们可以看出,这个函数内部是直接调用的plus(element: T): List<T>
。
代码示例
>>> list1 + 10 [1, 2, 3, 10] >>> list1.plusElement(10) [1, 2, 3, 10] >>> list1.plus(10) [1, 2, 3, 10]