sequence称之为序列,也是一种容器类型--(Sequence<T>),序列提供了和迭代器(Iterable)相同的函数,只不过序列的实现方式跟普通的集合处理方式不同而已。函数
首先序列式惰性的,惰性的含义就是咱们对序列进行各类一些列的变换的操做的时候,会对序列中的元素依次进行变换而且保存到Sequence对象里面,当咱们求情整个处理链的结果的时候才会进行最终的计算而且返回对应的结果好比Int、Boolean、List<T>。避免产生了中间步骤的结果,从而提升了整个集合处理链的性能。普通的集合在进行变换操做的时候是先遍历集合中的元素依次处理而且返回一个新的集合而后在此基础之上再进行其他的操做,最后返回结果,可见其中会产生不少的性能消耗。但是序列的延迟性质也增长了一些消耗,这些开销在处理在处理较小的集合的时候会显得很重要了。所以怎么选择哪一种状况更合适显得很重要。性能
今天着重记录了一下序列的基本使用以及sequence()函数的使用。spa
咱们若是想直接建立一个序列能够这样直接建立:翻译
val sequence1 = sequenceOf("a", "b", "c")
使用的时候咱们能够直接toList进行list的遍历等操做。对象
还能够在List的基础之上进行转换序列操做:blog
val list = listOf("d", "e", "f") val sequence2 = list.asSequence() println(sequence2.toList())
就能够很轻松的进行序列的转换了。it
使用起来比较简单,重要的就是要了解序列它的实现原理,它跟集合的不一样的地方。class
还有一种方式咱们经过计算函数的方式来计算序列中元素的构建过程。这时候咱们要用到generateSequence()函数了,它是一个没有边界的序列,大小能够无限的生长,知道提供的元素的函数返回null为止,序列也就中止生成了。容器
val generateSequence = generateSequence(2) { it * 3 }.take(10) println(generateSequence.toList())
其中的2的含义是说咱们的序列从2开始而后根据传入的函数参数规则进行生成序列元素,咱们的这里的规则就是上一个元素*3就是下一个元素的值。基础
打印出来以下:
[2, 6, 18, 54, 162, 486, 1458, 4374, 13122, 39366]
这个是最基本的使用方式,咱们看到take()函数,它须要咱们传递一个Int的数值,告诉序列我取到第十个的时候就中止了,序列也就不会再产生元素了。
点进去发现其实他返回的仍是序列对象:
说明这个函数还不是最终的计算方法,返回的仍是序列sequence对象,真正最后经过toList以后返回的就是一个集合了:
最后的返回就是一个集合了,这才是序列最后计算的时刻,一样的toList函数,这里就是序列的扩展函数了,使用方法就不同了。
还有一种实现方式能够终止函数的生成,不用take()函数来终止了,咱们能够经过本身定义的元素生成函数来实现:
val generateSequence1 = generateSequence(2){ if((it +3) < 20) it + 3 else null } println(generateSequence1.toList())
打印以下:
[2, 5, 8, 11, 14, 17]
当生成的元素小于20的时候函数就会直接返回null,那么序列就中止生成了。
最后呢,我记录了一下yield()函数,翻译过来是生产、产生的意思,那就顾名思义了。
使用方法看看这个例子:
val sequence = sequence { val start = 0 yield(start) // 依次放入序列之中 0 yieldAll(1..5 step 2) // 一、三、5 yieldAll(generateSequence(8) { it * 3 }) //八、2四、72 }
yield函数是对序列生产一个元素,放入序列之中,而且暂停sequence()函数执行,直到下一个请求函数元素到来。
首先咱们先往序列里面放入0这个元素,而后又放入一个list,规则step函数 一、三、5集合,最后经过generateSequence()经过函数生成元素而且最后咱们take(7),取前七个为止输出以下:
[0, 1, 3, 5, 8, 24, 72]
ok!