Kotlin集合扩展函数 - 转换
Kotlin 集合类型提供了很多用于转换的扩展函数。
这里需要指出示例里的intList为
val intList: List<Int> = listOf(1, 2, 3)
关联函数:使用转换函数把Array或Iterable转换为Map:
数组
fun <T, K, V> any_array<T>.associate(
transform: (T) -> Pair<K, V>
): Map<K, V>
Iterable
fun <T, K, V> Iterable<T>.associate(
transform: (T) -> Pair<K, V>
): Map<K, V>
示例:
intList.associate {
Pair(it.toString(), it)
}
//结果为:{1=1, 2=2, 3=3}
使用转换函数把集合的元素映射为目的元素,返回转换后的新列表
Map
fun <K, V, R> Map<out K, V>.map(
transform: (Entry<K, V>) -> R
): List<R>
数组
fun <T, R> any_array<T>.map(transform: (T) -> R): List<R>
Iterable
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R>
示例
intList.map { it + 1 }
//结果为:[2,3,4]
mapNotNull和map类似,但是它只返回非null的值作为新列表的元素。
示例
intList.mapNotNull { null }
//结果为:[],原因是所有返回的都是null
map函数是以集合里的元素作为转换函数的输入,而mapIndexed则把数组和Iterable的元素以及元素对应的索引作为转换函数的输入,使用转换函数后映射为列表新的值。
数组
fun <T, R> any_array<T>.mapIndexed(
transform: (index: Int, T) -> R
): List<R>
Iterable
fun <T, R> Iterable<T>.mapIndexed(
transform: (index: Int, T) -> R
): List<R>
示例
intList.mapIndexed{ idx, value ->
if (idx == 0) value + 1 else value + 2
}
//结果为:[2,4,5]
与mapIndexed类似,但是只返回非null的值作为新列表的元素
示例
intList.mapIndexedNotNull { idx, value ->
if (idx == 0) null else value + 2
}
//结果为:[4,5]
mapKeys和mapValues是应用于Map,分别是对Map的键和值做映射,与其他映射返回的是列表不同,它们仍然是返回Map,只是Map的键或值是通过转换函数映射后的新值。
mapKeys
fun <K, V, R> Map<out K, V>.mapKeys(
transform: (Entry<K, V>) -> R
): Map<R, V>
mapValues
fun <K, V, R> Map<out K, V>.mapValues(
transform: (Entry<K, V>) -> R
): Map<K, R>
示例
aMap.mapKeys { pair -> pair.key + ", mate" }
//结果为:{hi, mate=1, hello, mate=2}
aMap.mapValues { pair -> pair.value + 2 })
//结果为:{hi=3, hello=4}
反转函数有两个:revers和reversed。
reverse:是对原来的列表直接做反转。
fun <T> any_array<T>.reverse()
fun <T> MutableList<T>.reverse()
reversed:返回一个与原来列表元素相反顺序的新列表。
fun <T> Array<out T>.reversed(): List<T>
fun ByteArray.reversed(): List<Byte>
fun ShortArray.reversed(): List<Short>
fun IntArray.reversed(): List<Int>
fun LongArray.reversed(): List<Long>
fun FloatArray.reversed(): List<Float>
fun DoubleArray.reversed(): List<Double>
fun BooleanArray.reversed(): List<Boolean>
fun CharArray.reversed(): List<Char>
fun <T> Iterable<T>.reversed(): List<T>
分区函数用于把一个列表分为两个列表,这两个列表是根据预测函数返回的布尔值决定,预测函数返回true的元素进入第一个列表,否则为第二个列表的元素。
数组
fun <T> any_array<T>.partition(
predicate: (T) -> Boolean
): Pair<List<T>, List<T>>
Iterable
fun <T> Iterable<T>.partition(
predicate: (T) -> Boolean
): Pair<List<T>, List<T>>
示例
intList.partition { it > 2 })
//结果为:Pair([1,2], [3])
slice用于获取列表里指定索引范围的元素。
使用IntRange指定索引范围
fun <T> Array<out T>.slice(indices: IntRange): List<T>
fun ByteArray.slice(indices: IntRange): List<Byte>
fun ShortArray.slice(indices: IntRange): List<Short>
fun IntArray.slice(indices: IntRange): List<Int>
fun LongArray.slice(indices: IntRange): List<Long>
fun FloatArray.slice(indices: IntRange): List<Float>
fun DoubleArray.slice(indices: IntRange): List<Double>
fun BooleanArray.slice(indices: IntRange): List<Boolean>
fun CharArray.slice(indices: IntRange): List<Char>
fun <T> List<T>.slice(indices: IntRange): List<T>
使用Iterable指定特定的索引
fun <T> Array<out T>.slice(indices: Iterable<Int>): List<T>
fun ByteArray.slice(indices: Iterable<Int>): List<Byte>
fun ShortArray.slice(indices: Iterable<Int>): List<Short>
fun IntArray.slice(indices: Iterable<Int>): List<Int>
fun LongArray.slice(indices: Iterable<Int>): List<Long>
fun FloatArray.slice(indices: Iterable<Int>): List<Float>
fun DoubleArray.slice(indices: Iterable<Int>): List<Double>
fun BooleanArray.slice(indices: Iterable<Int>): List<Boolean>
fun CharArray.slice(indices: Iterable<Int>): List<Char>
fun <T> List<T>.slice(indices: Iterable<Int>): List<T>
sorted是是把列表里的元素按自然顺序排序,返回排序后的列表。这里的前提是列表里的元素是可比较的。
fun <T : Comparable<T>> Iterable<T>.sorted(): List<T>
示例
intList.sorted())
//结果[1,2,3]
sortedBy则是根据选择selector返回的值按自然顺序排序,返回排序后的列表。其中selector函数返回的值是可比较的。
fun <T, R : Comparable<R>> Iterable<T>.sortedBy(
selector: (T) -> R?
): List<T>
示例
users.sortedBy{user -> user.age}
sortedDescending和sortedByDescending相应的分别和sorted与sortedBy函数对应,但是排序的顺序是降序。
sortedWith则是安装指定的comparator来对值进行比较,在这里可以很灵活定义自己的比较器。
fun <T> Iterable<T>.sortedWith(
comparator: Comparator<in T>
): List<T>
示例
intList.sortedWith(Comparator<Int> { x, y ->
when {
x == 2 -> 1
y == 2 -> -1
else -> y - x
}
})
//输出结果为[3,1,2]
展开
flatten函数把多个集合构成的一个集合展开,把所有集合的元素合并在一个集合返回
fun <T> Iterable<Iterable<T>>.flatten(): List<T>
示例
listOf(intList, aSet).flatten()
//输出[2,3,4,1]
infix fun <T, R> Iterable<T>.zip(
other: Array<out R>
): List<Pair<T, R>>
示例
listOf(3, 4).zip(intList)
//输出为[(3,1), (4,2)]
unzip则是把Pair列表转换为两个列表对
fun <T, R> Iterable<Pair<T, R>>.unzip(): Pair<List<T>, List<R>>
示例
listOf(Pair("hi", 1), Pair("hello", 2)).unzip()
Pair([hi, hello], [1,2])