朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Allen
    总是创建新集合的劣势主要有: 1. 比较浪费内存; 2. 当调用次数较频繁时,会导致频繁的 GC,造成非必要的资源开销。 在服务端程序中,如果并发较大时,不太适合使用这些 API。

    作者回复: 说得很好。

    2022-03-16
    8
  • Shanks-王冲
    是否会存在劣势呢?如何取舍呢? 我猜从2个角度,来大致估算下会消耗多少内存,第一,中间操作符个数数量,比如:一个list,一套「过滤、转换、分组、分割、求和」组合拳下来;第二,集合中item的大小,比如:大的item可以是一张bitmap(200kb~1M),小的item可以是 Stu(name, age),再用考虑用sequence(惰性)的估算一遍,问问自己或开发同事,能接受嘛? 涛哥,能否从并发的角度,聊聊「Kotlin推崇的不变性(Immutable)和无副作用特点」:)或者,涛哥有计划针对每节课留下的作业,进行一个统一答疑嘛,并聊聊涛哥你留下的每个思考题的初衷,本意是想引导同学往几个方向扩展下,比如:今天的思考题,大概率的引导方向是『并发安全』、集合与序列(Sequence),甚至Kotlin语言设计哲学:)

    作者回复: 答案很棒! PS:针对课后思考题,我在后续会抽一部分出来讲解的,但应该不会讲解每节课的思考题。

    2022-03-28
    2
  • 白泽丶
    劣势: 一些列集合操作会产生多个临时对象,造成GC频繁。 平时注意对于一些大数据的转换操作,或调用频繁的地方要慎用。

    作者回复: 不错的答案,赞~

    2022-04-17
    1
  • 魏全运
    这个问题我之前也提到过,这个对性能和内存占用都有影响,尤其是操作符很多的情况下,会创建大量的集合拷贝副本,针对这种情况可以用sequence进行优化。 但Kotlin的这种不变形在多线程操作的情况下有优势,不用担心数据并发访问时的异常(比如ConcurrentModifiedException)。 因此如何使用还是要视使用场景来定。

    作者回复: 很棒的答案。

    2022-03-16
    1
  • 抱紧我的小鲤鱼
    我觉得flod是reduce的特殊情况

    作者回复: 我其实更倾向于,reduce是fold的特殊情况,fold不需要初始值的情况下,就是reduce。不过,这不重要吧,反正它俩挺像的~

    2022-04-28
  • Paul Shan
    返回新数据避免了状态改写,减少了出错的概率,多数情况下是最优的,少数情况下,可能耗费内存过多,需要优化。

    作者回复: 是的。

    2022-03-24
  • 白乾涛
    是否存在劣势?该如何取舍? 有优势就有劣势,劣势就源自于优势。 如何取舍,那就看优势更明显,还是劣势更严重了。

    作者回复: 是这个道理。

    2022-03-23
    2
  • 7Promise
    创建新的集合必然消耗更多资源

    作者回复: 是的。

    2022-03-16
  • Geek_6061ea
    Kotlin集合操作符整理汇总Iterable/Collection/List/Set/Map:https://blog.csdn.net/vitaviva/article/details/107587134
    2022-08-04归属地:北京
    1
    1
  • Calvin
    老师好,请教下:kotlin的这些集合操作符,跟Java8的stream API 一样吗?Java8的流API好像是数据一个一个流动经过操作符的,不像这里说的kotlin那样一个操作符是所有数据for循环遍历并且每次新建新的集合接收新数据并返回,所以其实Java8的应该是能支持无限数据的流的。
    2023-09-08归属地:广东
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部