Kotlin - Collection 和 sequence

文章目录[x]
  1. 0.1:Collection实现
  2. 0.2:Sequence实现
  3. 0.3:性能比较

在我们开发过程中经常处理集合,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collectionsequence

假如有一组数字,先把其转换为String,然后取第一个以1开始的字符串。

Collection实现

listOf(211,12,144,5,7).map {
     it.toString()
 }.first{
     it.startsWith("1")
 }

listOf默认创建的就是Collection类型的集合,调用的第一个函数是map,它会创建一个新的集合,会遍历原来的集合来将其转换为String然后添加到新的集合中。然后调用first函数,会遍历集合直到出现第一个以1开始的字符串。它的map和first函数都是内联函数。

Sequence实现

 listOf(211,12,144,5,7).asSequence().map {
    it.toString()
 }.first{
    it.startsWith("1")
 }

调用的第一个方法是asSequenceCollection基于迭代器转换为Sequence。然后是基于迭代器的map和first操作(每个元素都会执行一遍),这个操作相当于每个元素先执行map再执行first,即

  • 211 ->"211"(map)->(first) 
  • 12 ->"12"(map)->"12"(first)  

由此我们就不需要执行后面元素的操作。

public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R> {
 return TransformingSequence(this, transform)
}

从上面可以看出,它不是内联函数,每个元素操作时都需要创建Function对象。

性能比较

无论是使用Collection或者SequenceKotlin标准库都提供了许多的操作函数。在某些情况下,Sequence可以帮助避免进行不必要的工作。

Collection操作使用内联函数,所有操作的字节码和传递给它的lambda的字节码将是内联的。

Sequence不使用内联函数,因此都会为每个操作创建新的Function对象。

在处理比较小的集合时,这两种操作方式没太大区别,推荐使用Collection。在处理大型的集合时,中间许多元素操作并不需要,建议使用Sequence。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00