Kotlin中的序列——Sequence

76 阅读1分钟

序列(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)
    }

list_sapmle.png

序列操作:

     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)
    }

sequence.png

可以看到最终结果是一样的,但是耗时差了很多,普通集合操作用了748毫秒,而序列操作仅用时2毫秒

普通集合操作:每一次操作都会产生新的中间结果

序列操作:惰性求值,在进行中间操作的时候,是不会产生中间数据结果的,只有等到进行末端操作的时候才会进行求值。

上面的例子中,普通集合操作时流程:

img_list.png

序列操作时:

img_sequence.png

序列只有等到进行末端操作才会启动,如果上面的例子中,把.toList()去掉,整个流程将不会进行操作