2012-01-20 44 views
0

据Scaladoc,奇怪的行为在斯卡拉并行查看

视图是一些集合的懒惰版本。集合变换器(如map或filter或++)在应用于视图时不会遍历任何元素。相反,他们创建了一个新的视图,它只是记录了该操作需要应用的事实。

这意味着操作将不会应用,直到元素被访问。但是如何平行?

看看这个例子:

def tn = Thread.currentThread.getName 
val strList = List("I", "am", "a" , "student", ".", "I", "come", "from", "China", ".","I","love","peace") 
val pvs = strList.par.view.filter{ s => println("f "+ tn); s == "I"}.map{s => println("m " + tn); s.toLowerCase} 

第二个将打印出类似如下:

enter image description here

当您在pvs申请foreach,它输出: enter image description here

我不明白为什么表演的并行风格NCE是不一样的正常之一:

val strList = List("I", "am", "a" , "student", ".", "I", "come", "from", "China", ".","I","love","peace") // or read from a text file , e.g. article.txt 
strList.view.filter{s => println("f"); s == "I"}.map{s => println("m"); s.toLowerCase}.foreach(s => println("p")) 
+4

如果可能的话,请提供每次cut'n'paste的文本,而不是图片。顺便说一下:什么是'tn',线名? –

+0

Downvoted因为图像复制和粘贴文本会好得多。 –

回答

1

因为解释器通过迫使它如果表达式是一个并行集合视图,以便它能够进行打印(在本质计算表达式,强制观点)。尝试无论是运行这个作为一个独立的Scala程序,或做到这一点:

scala> object foo { var bar: AnyRef = null } 

scala> foo.bar = strList.par.view.filter{ s => println("f "+ tn); s == "I"}.map{s => println("m " + tn); s.toLowerCase} 

编辑:

另一个问题上面是平行的意见filter方法 - 不同于常规视图,它通过强制征收实施。这意味着当您在并行view上调用filter时,整个过滤的集合将被强制到一个数组中,并且必须调用与过滤器关联的谓词。像groupBy等方法在常规视图上执行相同的操作。

+0

不好意思,你这个例子的意思是什么? –

+1

该示例的要点是,如果通过将平行视图表达式分配给某个对象中的某个字段,如果您拒绝解释器在右侧(这是一个平行视图)上打印表达式,解释器将不会评估该视图调用'force'。所以,当你调用'filter'和'map'时,强制不会发生 - 它只发生在解释器中,因为它需要打印视图。这是因为解释器专门处理集合视图(避免使用'force'),但它并不是以特定方式处理并行集合视图。疏忽:) – axel22

+0

对不起,你的例子不是平行视图 –