2012-01-20 40 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

對不起,你的例子不是平行視圖 –