【问题标题】:What is the difference between the methods iterator and view?方法迭代器和视图有什么区别?
【发布时间】:2011-06-15 10:40:27
【问题描述】:
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)

除了使用 next,hasNext,什么时候应该选择 iterator over view 或 view over iterator?

【问题讨论】:

    标签: scala collections


    【解决方案1】:

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

    还有一件事。至少在Range、view 返回一个SeqView,它是Seq 的子类型,所以你可以返回或从头开始,做所有有趣的sequency 事情。

    我猜迭代器和视图之间的区别在于前面和后面。预计迭代器将发布已看到的内容。一旦next 被调用,前一个是,希望,放手。视图则相反。他们承诺不会获得没有被要求的东西。如果您查看所有素数,一个无限集,它只会获得您要求的那些素数。如果你想要第 100 个,101 不应该占用内存。

    【讨论】:

    • 参见 Iterator#map,它创建了一个新的迭代器,它懒惰地评估传递给 map 的每个“下一个”的函数。所以它看起来就像一个视图
    • @Ittay:是的,但这不在合同中。迭代器承诺“返回下一个元素并将其从迭代器中丢弃的下一个方法。”而 IterableView 承诺是“非严格的”。
    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

      page 讨论何时使用视图。

      总之,视图是调和关注点的有力工具 考虑模块化的效率。但为了不被 纠结于延迟评估方面,应该限制意见 到两个场景。您可以在纯功能代码中应用视图 集合转换没有副作用。或者你 将它们应用于完成所有修改的可变集合 明确地。最好避免的是视图和操作的混合 在创建新集合的同时也有副作用。

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 2016-11-06
        • 2012-06-14
        • 2011-07-17
        • 2019-10-25
        • 2014-12-05
        • 2012-02-10
        • 2020-11-01
        • 2013-04-26
        相关资源
        最近更新 更多