为什么scala的并行序列没有contains方法?

pla*_*aux 6 parallel-processing scala scala-2.9

为什么

 List.range(0,100).contains(2)
Run Code Online (Sandbox Code Playgroud)

工作,而

 List.range(0,100).par.contains(2)
Run Code Online (Sandbox Code Playgroud)

才不是?

这计划在未来?

Lui*_*hys 10

目的论的答案是,因为它contains是在SeqLike但不是在中定义的ParSeqLike.

如果这不能满足你的好奇心,你可以发现它SeqLikecontains定义如下:

def contains(elem: Any): Boolean = exists (_ == elem)
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子,你可以写

List.range(0,100).par.exists(_ == 2)
Run Code Online (Sandbox Code Playgroud)

ParSeqLike还缺少其他一些方法,其中一些方法很难有效实施(例如indexOfSlice),有些方法不太明显(例如combinations- 可能因为这只对小型数据集有用).但是如果你有一个并行集合,你也可以使用它.seq来回到线性版本并返回你的方法:

List.range(0,100).par.seq.contains(2)
Run Code Online (Sandbox Code Playgroud)

至于为什么图书馆设计师把它排除在外......我完全猜测,但也许他们想要为简单起见减少方法的数量,而且它几乎一样容易使用exists.

这也提出了一个问题,为什么要contains定义SeqLike而不是所有收藏品的祖父GenTraversableOnce,你找到了exists什么?一个可能的原因是,contains对于Map在语义上是不同的方法来,关于SetSeq.A Map[A,B]是a Traversable[(A,B)],所以如果contains定义为Traversable,则contains需要采用元组(A,B)参数; 然而Map,这contains只是一个A论点.鉴于此,我认为contains应该定义GenSeqLike- 也许这是一个将被纠正的疏忽.

(我想起初可能并行序列没有,contains因为搜索并行集合上找到目标后要停止的位置比线性版本效率低得多(各种线程在找到值后执行了大量不必要的工作) :看到这个问题),但那可能不对,因为exists那里.)