Kotlin学习-集合和序列(3)

本文介绍了Kotlin中的集合和序列,包括集合的不可变与可变写法,以及常用函数式API如filter和map的使用。强调了合理安排代码顺序以提高性能,并对比了集合与序列的区别,指出序列在处理大型集合时能避免中间集合的性能消耗。最后,通过示例展示了序列的惰性计算特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前面两篇我们学习了 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中,集合listmapset都有两种写法,可变和不可变。

1.2 集合的函数式API
  • filtermap
    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

从上面的例子可以看出filtermap的作用,很方便的做集合进行操作。但也可以看出来,上面的两个日志将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
    上面说过了常用的mapfilter,这里再简单的介绍下allanyfindcount
    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的集合和序列的介绍就结束了,具体的应用场景还需要结合自己的项目去使用最适合的。学无止境,继续搬砖吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值