前面两篇我们学习了
Kotlin 学习-基础语法(1)和
Kotlin学习-函数的定义和调用(2)
这次来看下kotlin 中的集合和序列。
1.集合
1.1 集合的写法
首先我们来看下kotlin 中集合的几种写法,如下:
private fun testList() {
val list1 = listOf(1, 2, 3)
val list2 = mutableListOf(4, 5, 6)
println("list1 = $list1")
println("list2 = $list2")
}
>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
上面的listOf() 表示不可变的列表, mutableListOf() 表示可变的列表。在kotlin 中,集合list ,map ,set 都有两种写法,可变和不可变。
1.2 集合的函数式API
filter 和map filter :可以移除不想要的元素。起过滤的作用 map :可以把每一个元素给映射到另一个新集合中。起变换的作用 我们看一个例子:
fun testApi(){
listOf(1, 2, 3, 4)
.map {
println("item1 = $it")
it * it
}.filter {
println("item2 = $it")
it > 4
}
}
>>>item1 = 1
item1 = 2
item1 = 3
item1 = 4
item2 = 1
item2 = 4
item2 = 9
item2 = 16
从上面的例子可以看出filter 和map 的作用,很方便的做集合进行操作。但也可以看出来,上面的两个日志将list 都执行了一遍,有点没有必要,我们调整下顺序再看下。
fun testApi2(){
listOf(1, 2, 3, 4)
.filter {
println("item1 = $it")
it > 3
}.map {
println("item2 = $it")
it * it
}
}
>>>item1 = 1
item1 = 2
item1 = 3
item1 = 4
item2 = 4
可以看到将filter 放到前面,map 放到后面执行,最后map 只执行了一次。 由此可见,合理的编写代码的顺序是可以提高程序性能的。
all,any,find,count 上面说过了常用的map 和filter ,这里再简单的介绍下all ,any ,find ,count 。 all :判断所有元素是否都满足条件; any :是否至少有一个元素满足条件; find :找到一个满足条件的元素就返回; count :有多少个元素满足条件;
看下下面的例子执行可以更直观的理解:
fun testApi3(){
val list = listOf(1, 2, 3, 4)
println("test all: ${list.all { it >3 }}")
println("test any: ${list.any { it > 3 }}")
println("test find: ${list.find { it > 3 }}")
println("test count: ${list.count { it > 3 }}")
}
>>>test all: false
test any: true
test find: 4
test count: 1
以上的api 灵活的使用可以大大的提高你的开发速度。
2.序列
在kotlin 中除了集合外还有一种惰性集合:序列。 有了集合为什么还要设计序列呢,他们有什么不同呢,可以看这位大神的文章,让你迷惑的 Kotlin 代码,再来一道~
我们这里只介绍下这个序列到底咋回事。kotlin 的惰性集合入口是Sequence 接口,表示的是一个可以逐个列举元素的元素序列,我们先用一个例子看下:
fun testSequence() {
listOf(Person("Jay", 20),
Person("Tom", 30),
Person("Carry", 40))
.asSequence()
.map {
println("map, $it")
it.age
}.filter {
println("filter, $it")
it > 30
}
}
>>> 啥也没输出
搞完代码一看啥也没输出,这是什么玩意,哪里出错了???看了下官方文档,发现将序列重新转为集合才会触发这个序列的执行,来试试。
fun testSequence() {
val toList = listOf(
Person("Jay", 20),
Person("Tom", 30),
Person("Carry", 40)
)
.asSequence()
.map {
println("map, $it")
it.age
}.filter {
println("filter, $it")
it > 30
}.toList()
println("toList: $toList")
}
>>>map, Person(name=Jay, age=20)
filter, 20
map, Person(name=Tom, age=30)
filter, 30
map, Person(name=Carry, age=40)
filter, 40
toList: [40]
从日志打印可以印证序列的定义:可以逐个列举元素的元素序列。 那既然最后的结果和集合是一样的,为什么要设计序列呢? 首先,我们看下官方序列的适应场景:需要对一个大型集合执行链式操作时要使用序列。集合的每步操作会创建中间集合,如果集合比较大,那么中间集合的重新分配会消耗巨大,影响执行性能。
3.集合和序列的区别
通过上面的集合和序列的了解,不难看出它们的区别。下面画张图形象的看下: 到这里我们kotlin 的集合和序列的介绍就结束了,具体的应用场景还需要结合自己的项目去使用最适合的。学无止境,继续搬砖吧。
|