在斯卡拉,“观点”是做什么的?
具体来说,我在这里看问题1
所列出的代码如下
val r = (1 until 1000).view.filter(n => n % 3 == 0 || n % 5 == 0).sum
除了“查看”,我可以关注所有内容。 事实上,如果我拿出来的代码仍然编译和产生完全相同的答案。
View产生一个懒惰的集合,所以调用例如filter
不会评估集合的每个元素。 元素只有在明确访问后才被评估。 现在sum
可以访问所有的元素,但是通过view
来调用filter
并不会创build一个完整的Vector。 (请参阅Steve的评论)
使用视图的一个很好的例子是:
scala> (1 to 1000000000).filter(_ % 2 == 0).take(10).toList java.lang.OutOfMemoryError: GC overhead limit exceeded
Scala试图创build一个拥有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)
我对斯卡拉了解不多,但也许这个页面可能有帮助…
有两个主要的方法来实现变压器。 一个是严格的,这是一个新的集合,其所有元素是由变压器的结果。 另一种是非严格的或懒惰的,即只构造结果集合的代理,并且它的元素只在需要的时候被构造。
视图是一种特殊的集合,它代表了一些基本的集合,但却懒散地实现了所有的变形。
所以听起来好像代码仍然可以不用view
,但理论上可能会做一些额外的工作, 严格而不是懒惰地构build你的集合的所有元素。