序列(Sequence)类似 Java8 中的 Stream,类似协程中的流Flow(没有切换线程和丰富的操作符)
看一个例子:
普通集合操作:
fun listSample(){
val currentTimeMillis = System.currentTimeMillis()
val list = (0..10000000).filter { it in 101..199 }.map {
"第${it}个"
}.take(10)
LogUtil.e(System.currentTimeMillis()-currentTimeMillis)
LogUtil.e(list)
}
序列操作:
fun sequenceSample(){
val currentTimeMillis = System.currentTimeMillis()
val list = (0..10000000).asSequence().filter { it in 101..199 }.map {
"第${it}个"
}.take(10).toList()
LogUtil.e(System.currentTimeMillis()-currentTimeMillis)
LogUtil.e(list)
}
可以看到最终结果是一样的,但是耗时差了很多,普通集合操作用了748毫秒,而序列操作仅用时2毫秒
普通集合操作:每一次操作都会产生新的中间结果
序列操作:惰性求值,在进行中间操作的时候,是不会产生中间数据结果的,只有等到进行末端操作的时候才会进行求值。
上面的例子中,普通集合操作时流程:
序列操作时:
序列只有等到进行末端操作才会启动,如果上面的例子中,把.toList()去掉,整个流程将不会进行操作