List.range(0,100).contains(2)
工作,同時
List.range(0,100).par.contains(2)
不?
這是計劃未來?
List.range(0,100).contains(2)
工作,同時
List.range(0,100).par.contains(2)
不?
這是計劃未來?
非teleological的答案是,這是因爲contains
定義在SeqLike
而不是ParSeqLike
。
如果不能滿足您的好奇心,你可以找到SeqLike
的contains
被這樣定義:
def contains(elem: Any): Boolean = exists (_ == elem)
因此,對於你的例子,你可以寫
List.range(0,100).par.exists(_ == 2)
ParSeqLike
缺少其他方法也很少,其中一些方法難以有效實施(例如indexOfSlice
),另一些方法不太明顯的原因(例如combinations
--可能因爲這隻對小數據集有用)。但是,如果你有一個平行的集合,你也可以使用.seq
要回線的版本,讓你的方法回:
List.range(0,100).par.seq.contains(2)
至於爲什麼庫的設計者留下出來...我完全猜,但也許他們爲了簡單起見想減少方法的數量,並且使用exists
幾乎同樣簡單。
這也引發了一個問題,爲什麼contains
定義在SeqLike
而不是所有收藏的granddaddy,GenTraversableOnce
,你在哪裏找到exists
?可能的原因是Map
的contains
在語義上與Set
和Seq
的方法不同。 A Map[A,B]
是Traversable[(A,B)]
,所以如果contains
被定義爲Traversable
,contains
將需要採取元組(A,B)
變元;然而Map
的contains
只需要一個A
參數。鑑於此,我認爲contains
應該在GenSeqLike
中定義 - 也許這是一個將被糾正的疏忽。
(我以爲最初也許並行序列沒有contains
,因爲在並行集合上找到目標後,搜索您要停止的位置比線性版本效率低很多(各種線程執行大量不必要的工作在找到該值後:請參閱this question),但這不可能是正確的,因爲exists
在那裏。)
'indexOfSlice'會有意義,因爲並行序列確實有序,只是它們不會執行並行操作訂購。但是一個高效的,可擴展的'indexOfSlice'尚未實現。 – axel22
@ axel22謝謝,更新。 –
非常感謝!我猜測他們根本沒有實現它,因爲它不像你期望的那樣工作,即一旦找到一個值就返回。 – placeybordeaux