用 Kotlin 写 Android 11—lambda 集合操作

时间:2021-6-12 作者:qvyue

lambda 为集合操作提供了很多标准库方法,书中介绍了几个常用的,另外还有很多可以在实际使用时,根据需求再去库中查找类似的方法。

  • filter 和 map
filter{ 条件 } //filter 会将满足条件的筛选出来,其他的去掉
map{ 操作 } //map 会对集合每个元素做操作,并返回新的集合
  • all, any, count, find
all{ 条件 } //检查集合所有元素是否都满足条件
any{ 条件 } //检查集合是否有至少一个满足条件
count{ 条件 } //统计集合满足条件的元素个数,效率上来说,count 可能更高于 .size 操作
find{ 条件 } //找到满足条件的第一个元素,或者返回 null
  • groupBy
groupBy{ 条件 } //将根据条件对集合进行分组,返回的是分组后的 Map 集合,每组各是一个集合
//对 Map 的 key 和 value,可以有 filterKeys,filterValues 和 mapKeys,mapValues 的操作
  • flatMap 和 flatten
flatMap{ 操作 } //会先对集合的元素进行操作,然后进行合并
flatten() //相比 flatMap,它就不需要操作,仅进行合并

性能优化:序列

前面介绍的方法都会涉及到中间步骤,并且会需要临时集合存储,而序列的作用就是避免创建这些临时中间对象。

序列的特性提现在「惰性」,也就是说只有在最终需要结果时才会被执行,一个序列操作分中间操作和末端操作。只要有末端操作才能算需要结果,也才能被执行。什么要的操作算末端操作呢?当做完一系列操作之后,想要获得一个集合,元素,数组或者其他能获取到的值时就算末端操作。具体点就比如,.toList() 就是获取一个 List 集合。

所以使用序列的优势在于,中间操作过程中不会产生中间对象用作临时存储,从而提高了效率。

序列的使用就是在集合上使用 asSequence 方法,并无其他特殊之处。与集合在为每个元素做一系列操作的不同之处是,序列是为每个元素做完一遍所有操作再去处理下一个约束,因此有些不必要处理的元素就会被省略掉,这也是提高效率的另一个表现。

当然对同一个序列做相同个数的操作,如果顺序不同,同样也会使执行的总次数不同,这个要结合具体情况做最佳分析(这就好比条条大路通罗马,但途经点先后不同可能耗时不同或者费用不同)

参考内容

「Kotlin 实战」

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。