2018-02-25

kotlin 关于 iterator 和 sequence 的区别

https://discuss.kotlinlang.org/t/why-sequence-instead-of-iterator/1845/8

Iterator 是一个有状态的对象,因为它只保存当前遍历的信息。只能被遍历一次,没有措施阻止你对一个 iterator 进行多次操作,不容易发现代码中隐藏的错误。

sequence 是无状态的,你每进行一次遍历都会创建一个新的 iterator。如果一个 sequence 不支持重复遍历(比如一个 iterator 封装成的 sequence),进行第二次遍历时你就拿不到 iterator 了。

sequence 比 iterator 更好,因为他的定义更清晰。推荐使用 Java8 的 Stream API 也是基于相同的理由。


sequence 的定义

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/index.html

sequence 的操作符按照 state requirements 可分为两组:

如果 sequence 操作符返回了一个 lazy 生成的 sequence,这种操作符被称为 intermediate,其他的被称为 terminal,比如 kotlin.sequences.Sequence.toList, kotlin.sequences.Sequence.max