Iterable与Sequence的用法几乎一样,比如都有说filter
、map
、forEach
、sum
等操作符。
1sequenceOf(1, 2, 3).map {
2 it * 2
3}.forEach {
4 println("$it")
5}
6
7listOf(1, 2, 3).map {
8 it * 2
9}.forEach {
10 println("$it")
11}
那为什么要有两个一样的接口呢?它们有什么区别吗?
虽然Iterable与Sequence接口非常相似,但是它们内部实现却完全不同,它们是为不同的应用场景设计的。
Iterable当调用操作符会立即执行操作符内部的代码,并且返回执行操作符后的结果,而Sequence只有有执行到某些操作符(比如first
、toList
、count
)才会真正执行操作符内部的逻辑,像这些操作符(比如map
、filter
)调用完成之后只会缓存操作符,并不会真正执行操作符内部的代码。
Iterable在调用操作符后会直接执行逻辑,得到最终结果再执行下一个操作符,而Sequence会逐个元素执行所有操作符,比如说第一个元素执行完成所有操作符之后,第二个元素才从第一个操作符开始执行,直到所有操作符执行完毕。
Iterable与Sequence更详细的区别可以参考Iterable(Collection)与Sequence的区别。
内容