【安卓】Kotlin 集合的变换与聚合
一、前言
<font face= 黑体>在 Kotlin 高阶函数与内联函数 中我们已经将 Kotlin 的 高阶函数 和 内联函数 讲完了,今天我们来讲 Kotlin 的 集合变换与聚合。
二、集合变换与聚合
2.1、集合的变换操作
<font face= 黑体>对于集合来说,最常见的使用方式就是对集合进行遍历,我们来看一下 Java 和 Kotlin 的遍历集合代码:
Java:
// 普通的 for 循环遍历for(int i = 0; i <= 10; i++) {
System.out.println(i);
}
// for each 遍历
for(int e : list) {
System.out.println(e);
}
// forEach 函数
list.forEach((e) - > {
System.out.println(e);
});
Kotlin:
// 普通的 for 循环遍历for(i in 0 .. 10) {
println(i)
}
// for each 遍历
for(e in list) {
println(e);
}
// forEach 函数
list.forEach {
println(it);
}
<font face= 黑体>在上面的 forEach 函数里面不能 continue 或者 break,但是我们有需要 break 和 continue 的需求要怎么办呢?其实我们有专用的方法来解决这样的需求,就是集合的 映射操作(Java 在 8 的时候也引入了这些操作,叫 流Stream),如下:
函数名 | 说明 |
---|---|
filter | 保留满足条件的元素 |
map | 集合中的所有元素 —— 映射到其他元素构成新集合 |
flatMap | 集合中的所有元素 —— 映射到新集合并合并这些集合得到新集合 |
2.1.1、filter 操作
<font face= 黑体>比如我们要从集合 [1, 2, 3, 4] 中将所有的偶数筛选出来,就可以用 filter 操作来实现,如下:
Java:
list.stream().filter(e -> e % 2 == 0);
Kotlin:
list.filter { it % 2 == 0 }
2.1.2、map 操作
<font face= 黑体>比如我们要把集合 [1, 2, 3, 4] 中的所有元素乘以 2,变成一个新集合,就可以用 map 操作来实现,如下:
Java:
list.stream().map(e -> e * 2);
Kotlin:
list.map { it * 2 }
<font face= 黑体>上面的 Kotlin 代码还可以写成下面这样:
list.asSequence().map { it * 2 }
<font face= 黑体>这两种写法区别主要是集合的操作是饿汉式的还是懒汉式的,如果加上 asSequence 的话,集合的操作就变成了懒序列了。我们通过下面的代码来解释这两种方式:
Java:
List<Integer> list = new ArrayList<>();list.addAll(Arrays.asList(1, 2, 3, 4));
list.stream()
.filter(e -> {
System.out.println("filter: " + e);
return e % 2 == 0;
})
.map(e -> {
System.out.println("map: " + e);
return e * 2 + 1;
})
.forEach(e -> {
System.out.println("forEach: " + e);
});
Kotlin:
val list = listOf(1, 2, 3, 4)list.asSequence()
.filter {
println("filter: $it")
it % 2 == 0
}.map {
println("map: $it")
it * 2 + 1
}.forEach {
println("forEach: $it")
}
<font face= 黑体>打印结果如下所示:
<font face= 黑体>如果我们把 asSequence() 去掉,就变成了饿汉式,代码如下:
val list = listOf(1, 2, 3, 4)list
.filter {
println("filter: $it")
it % 2 == 0
}.map {
println("map: $it")
it * 2 + 1
}.forEach {
println("forEach: $it")
}
2.1.3、flatMap 操作
<font face= 黑体>flatMap 操作可以看下面的图解:
2.2、集合的聚合操作
<font face= 黑体>集合除了有上述的变换操作外,集合还有聚合操作,如下:
函数名 | 说明 |
---|---|
sum | 所有元素求和 |
reduce | 将元素依次按规则聚合,结果与元素类型一致 |
fold | 给定初始化值,将元素按规则聚合,结果与初始化值类型一致 |
<font face= 黑体>Kotlin 的集合的聚合操作相比来讲没有变换操作重要,这里我就举个 fold 函数的例子吧,如下:
// 计算过程为 10 + 1 + 2 + 3,等于 16val foldResult1 = arrayOf(1, 2, 3).fold(10, { a, b -> a + b })
println(foldResult1)
//计算过程为 10 * 1 * 2 * 3,等于60
val foldResult2 = arrayOf(1, 2, 3).fold(10, { a, b -> a * b })
println(foldResult2)
<font face= 黑体>fold 函数的操作如下:
- <font face= 黑体>第一次执行时,由初始值 10 作为参数 a,由集合中第 0 个元素作为参数 b;
- <font face= 黑体>第二次执行时,第一次执行的返回值作为参数 a,由集合中第 1 个元素作为参数 b;
- <font face= 黑体>依次类推...;
- <font face= 黑体>最终将结果返回。
三 、小结
<font face= 黑体>本篇博客主要讲了 Kotlin 中的集合的变换与聚合,下一节我们讲 Kotin 的 SAM 转换 和 常用高阶函数。
四、源码
源码 已上传至 github,有需要可以直接下载。
以上是 【安卓】Kotlin 集合的变换与聚合 的全部内容, 来源链接: utcz.com/a/99666.html