Kotlin的Collection与Sequence操作异同点是什么(collection,kotlin,sequence,开发技术)

时间:2024-05-02 12:50:19 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

为什么需要这么个东西?既然 Collection 能实现效果为什么还需要 Sequence 呢?他们的区别又是什么呢?

区别与对比

Collection 是立即执行的,每一次中间操作都会立即执行,并且把执行的结果存储到一个容器中,没多一个中间操作符就多一个容器存储结果。

publicinlinefun<T,R>Iterable<T>.map(transform:(T)->R):List<R>{
returnmapTo(ArrayList<R>(collectionSizeOrDefault(10)),transform)
}
publicinlinefun<T>Iterable<T>.filter(predicate:(T)->Boolean):List<T>{
returnfilterTo(ArrayList<T>(),predicate)
}

比如常用的 map 和 filter 都是会新建一个 ArrayList 去存储结果,

Sequence 是延迟执行的,它有两种类型,中间操作和末端操作 ,主要的区别是中间操作不会立即执行,它们只是被存储起来,中间操作符会返回另一个Sequence,仅当末端操作被调用时,才会按照顺序在每个元素上执行中间操作,然后执行末端操作。

publicfun<T,R>Sequence<T>.map(transform:(T)->R):Sequence<R>{
returnTransformingSequence(this,transform)
}
publicfun<T>Sequence<T>.filter(predicate:(T)->Boolean):Sequence<T>{
returnFilteringSequence(this,true,predicate)
}

比如常用的 map 和 filter 都是直接返回 Sequence 的this 对象。

publicinlinefun<T>Sequence<T>.first(predicate:(T)->Boolean):T{
for(elementinthis)if(predicate(element))returnelement
throwNoSuchElementException("Sequencecontainsnoelementmatchingthepredicate.")
}

然后在末端操作中,会对 Sequence 中的元素进行遍历,直到预置条件匹配为止。

这里我们举一个示例来演示一下:

我们使用同样的筛选与转换,来看看效果

vallist=mutableListOf<Person>()
for(iin1..10000){
list.add(Person("name$i",(0..100).random()))
}
valtime=measureTimeMillis{
vallist1=list.filter{
it.age>50
}.map{
it.name
}.take(3)
YYLogUtils.w("list1$list1")
}
YYLogUtils.w("耗费的时间$time")
valtime2=measureTimeMillis{
vallist2=list.asSequence()
.filter{
it.age>50
}.map{
it.name
}.take(3).toList()
YYLogUtils.w("list2$list2")
}
YYLogUtils.w("耗费的时间2$time2")

运行结果:

当集合数量为10000的时候,执行时间能优秀百分之50左右:

Kotlin的Collection与Sequence操作异同点是什么

当集合数量为5000的时候,执行时间相差比较接近:

Kotlin的Collection与Sequence操作异同点是什么

当集合数量为3000的时候,此时的结果就反过来了,Sequence延时执行的优化效果就不如List转换Sequence再转换List了:

Kotlin的Collection与Sequence操作异同点是什么

读到这里,这篇“Kotlin的Collection与Sequence操作异同点是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

本文:Kotlin的Collection与Sequence操作异同点是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Java语言中的抽象类与继承实例代码分析下一篇:

9 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18