25 | 集合操作符:你也会“看完就忘”吗?
朱涛
你好,我是朱涛。
从这节课开始,我们就正式进入源码篇的学习了。当我们学习一门知识的时候,总是离不开 What、Why 和 How。在前面的基础篇、协程篇当中,我们已经弄清楚了 Kotlin 是什么,以及为什么要用 Kotlin。那么在这个模块里,我们主要是来解决 How 的问题,以此从根源上搞清楚 Kotlin 的底层实现原理。今天这节课,我们先来搞定集合操作符的用法与原理。
对于大部分 Java、C 开发者来说,可能都会对 Kotlin 的集合操作符感到头疼,因为它们实在太多、太乱了。即使通过 Kotlin 官方文档把那些操作符一个个过了一遍,但过一段时间在代码中遇到它们,又会觉得陌生。一看就会,看完就忘!
其实,Kotlin 的集合 API,本质上是一种数据处理的模式。
什么是数据处理模式?可以想象一下:对于 1~10 的数字来说,我们找出其中的偶数,那么这就是一种过滤的行为。我们计算出 1~10 的总和,那么这就是一种求和的行为。所以从数据操作的角度来看,Kotlin 的操作符就可以分为几个大类:过滤、转换、分组、分割、求和。
那么接下来,我会根据一个统计学生成绩的案例,来带你分析 Kotlin 的集合 API 的使用场景,对于复杂的 API,我还会深入源码分析它们是如何实现的。这样你也就知道,集合操作符的底层实现原理,也能懂得如何在工作中灵活运用它们来解决实际问题。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Kotlin集合操作符是一种强大的数据处理模式,包括过滤、转换、分组、分割、求和等操作。本文通过实际案例和源码分析,深入探讨了Kotlin集合API的使用场景和底层实现原理。在过滤方面,介绍了filter{}、filterIndexed{}和filterIsInstance()等操作符的使用方法和源码实现,以及filterIsInstance()借助了inline、reified关键字实现了类型实化。转换方面详细讲解了map{}和flatten()的使用方法和源码实现,并展示了如何结合flatten和filter来实现特定需求。接着介绍了分组API的使用,以及分割API的take、drop、slice的应用。最后,深入探讨了Kotlin的求和API,包括sumOf、reduce、fold的使用方法和比较。总结指出Kotlin集合API的操作符不仅适用于Kotlin集合,也与其他语言的API高度重叠,具有广泛的数据处理模式。读者通过本文学习不仅可以对Kotlin的Flow、Sequence有更全面的认识,还能轻松上手其他计算机语言。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(11)
- 最新
- 精选
- Allen总是创建新集合的劣势主要有: 1. 比较浪费内存; 2. 当调用次数较频繁时,会导致频繁的 GC,造成非必要的资源开销。 在服务端程序中,如果并发较大时,不太适合使用这些 API。
作者回复: 说得很好。
2022-03-168 - Shanks-王冲是否会存在劣势呢?如何取舍呢? 我猜从2个角度,来大致估算下会消耗多少内存,第一,中间操作符个数数量,比如:一个list,一套「过滤、转换、分组、分割、求和」组合拳下来;第二,集合中item的大小,比如:大的item可以是一张bitmap(200kb~1M),小的item可以是 Stu(name, age),再用考虑用sequence(惰性)的估算一遍,问问自己或开发同事,能接受嘛? 涛哥,能否从并发的角度,聊聊「Kotlin推崇的不变性(Immutable)和无副作用特点」:)或者,涛哥有计划针对每节课留下的作业,进行一个统一答疑嘛,并聊聊涛哥你留下的每个思考题的初衷,本意是想引导同学往几个方向扩展下,比如:今天的思考题,大概率的引导方向是『并发安全』、集合与序列(Sequence),甚至Kotlin语言设计哲学:)
作者回复: 答案很棒! PS:针对课后思考题,我在后续会抽一部分出来讲解的,但应该不会讲解每节课的思考题。
2022-03-282 - 白泽丶劣势: 一些列集合操作会产生多个临时对象,造成GC频繁。 平时注意对于一些大数据的转换操作,或调用频繁的地方要慎用。
作者回复: 不错的答案,赞~
2022-04-171 - 魏全运这个问题我之前也提到过,这个对性能和内存占用都有影响,尤其是操作符很多的情况下,会创建大量的集合拷贝副本,针对这种情况可以用sequence进行优化。 但Kotlin的这种不变形在多线程操作的情况下有优势,不用担心数据并发访问时的异常(比如ConcurrentModifiedException)。 因此如何使用还是要视使用场景来定。
作者回复: 很棒的答案。
2022-03-161 - 抱紧我的小鲤鱼我觉得flod是reduce的特殊情况
作者回复: 我其实更倾向于,reduce是fold的特殊情况,fold不需要初始值的情况下,就是reduce。不过,这不重要吧,反正它俩挺像的~
2022-04-28 - Paul Shan返回新数据避免了状态改写,减少了出错的概率,多数情况下是最优的,少数情况下,可能耗费内存过多,需要优化。
作者回复: 是的。
2022-03-24 - 白乾涛是否存在劣势?该如何取舍? 有优势就有劣势,劣势就源自于优势。 如何取舍,那就看优势更明显,还是劣势更严重了。
作者回复: 是这个道理。
2022-03-232 - 7Promise创建新的集合必然消耗更多资源
作者回复: 是的。
2022-03-16 - Geek_6061eaKotlin集合操作符整理汇总Iterable/Collection/List/Set/Map:https://blog.csdn.net/vitaviva/article/details/1075871342022-08-04归属地:北京11
- Calvin老师好,请教下:kotlin的这些集合操作符,跟Java8的stream API 一样吗?Java8的流API好像是数据一个一个流动经过操作符的,不像这里说的kotlin那样一个操作符是所有数据for循环遍历并且每次新建新的集合接收新数据并返回,所以其实Java8的应该是能支持无限数据的流的。2023-09-08归属地:广东
收起评论