迭代器和视图的方法有什么区别?

Itt*_*ayD 29 collections scala

scala> (1 to 10).iterator.map{_ * 2}.toList
res1: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> (1 to 10).view.map{_ * 2}.force
res2: Seq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
Run Code Online (Sandbox Code Playgroud)

除了使用next,hasNext之外,何时应该选择迭代器优先于视图还是查看迭代器?

Dan*_*ral 37

迭代器和视图之间存在巨大差异.迭代器只使用一次,按需计算,而视图使用多次,每次重新计算,但只需要重新计算.例如:

scala> val list = List(1,2,3).map{x => println(x); x * 2}
1
2
3
list: List[Int] = List(2, 4, 6)

scala> list(2)
res14: Int = 6

scala> list(2)
res15: Int = 6

scala> val view = List(1,2,3).view.map{x => println(x); x * 2}
view: scala.collection.SeqView[Int,Seq[_]] = SeqViewM(...)

scala> view(2)
3
res12: Int = 6

scala> view(2)
3
res13: Int = 6

scala> val iterator = List(1,2,3).iterator.map{x => println(x); x * 2}
iterator: Iterator[Int] = non-empty iterator

scala> iterator.drop(2).next
1
2
3
res16: Int = 6

scala> iterator.drop(2).next
[Iterator.next] (Iterator.scala:29)
(access lastException for the full trace)
Run Code Online (Sandbox Code Playgroud)


sbl*_*ndy 21

view产生一个懒惰的集合/流.它的主要魅力在于它不会尝试构建整个系列.当您只需要集合中的前几个项目时,这可以防止OutOfMemoryError或提高性能.iterator没有这样的保证.

还有一件事.至少在Range,view返回a SeqView,这是一个子类型Seq,所以你可以回头或从头开始,并做所有有趣的顺序的东西.

我猜迭代器和视图之间的区别是前后问题.预计迭代器将发布已经看到的内容.一旦next被召唤,前一个是希望放手.观点是相反的.他们承诺不会获得未被要求的东西.如果你有一个所有素数的视图,一个无限集,它只获得了你所要求的素数.你想要100,101不应该占用内存.

  • @Ittay:是的,但这不在合同中.Iteractor承诺'next方法返回下一个元素并从迭代器中丢弃它.' 而IterableView承诺是"非严格的". (3认同)