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不应该占用内存.
| 归档时间: |
|
| 查看次数: |
4845 次 |
| 最近记录: |