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 实战」
网友评论