首页 文章

在Scala中,“视图”有什么作用?

提问于
浏览
54

具体来说,我在这里看问题1

http://pavelfatin.com/scala-for-project-euler/

列出的代码如下

val r = (1 until 1000).view.filter(n => n % 3 == 0 || n % 5 == 0).sum

我可以遵循除“视图”之外的所有内容 . 事实上,如果我拿出视图代码仍然编译并产生完全相同的答案 .

2 回答

  • 89

    View生成一个惰性集合,以便调用例如 filter 不评估集合的每个元素 . 只有在显式访问元素后才会对元素进行评估 . 现在 sum 确实访问了所有元素,但是 viewfilter 的调用不会创建完整的Vector . (见史蒂夫的评论)

    使用视图的一个很好的例子是:

    scala> (1 to 1000000000).filter(_ % 2 == 0).take(10).toList
    java.lang.OutOfMemoryError: GC overhead limit exceeded
    

    在这里,Scala尝试使用 1000000000 元素创建一个集合,然后访问前10个 . 但是查看:

    scala> (1 to 1000000000).view.filter(_ % 2 == 0).take(10).toList
    res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
    
  • 22

    我对Scala了解不多,但也许this page可能有帮助......

    实现变压器有两种主要方式 . 一个是严格的,这是一个新的集合,其所有元素都是由变压器构成的 . 另一个是非严格或惰性的,即只构造结果集合的代理,并且仅在需要时才构造其元素 . 视图是一种特殊的集合,代表一些基本集合,但是懒惰地实现所有变换器 .

    所以听起来好像代码仍然可以在没有 view 的情况下工作,但理论上可能会做一些额外的工作,以严格而不是懒惰的方式构建集合的所有元素 .

相关问题