7

为什么

 List.range(0,100).contains(2)

工作,同时

 List.range(0,100).par.contains(2)

才不是?

这是为未来计划的吗?

4

1 回答 1

11

目的论的答案是,这是因为contains定义在SeqLike而不是在ParSeqLike

如果这不能满足您的好奇心,您可以发现SeqLike'scontains是这样定义的:

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上而不是在你找到的地方定义?一个可能的原因是for在语义上与 on和的方法不同。A是 a ,因此如果定义为,则需要采用元组参数;然而's只需要一个论点。鉴于此,我认为应该在- 也许这是一个将被纠正的疏忽。SeqLikeGenTraversableOnceexistscontainsMapSetSeqMap[A,B]Traversable[(A,B)]containsTraversablecontains(A,B)MapcontainsAcontainsGenSeqLike

(起初我认为并行序列可能没有,contains因为在并行集合上找到目标后搜索打算停止的位置比线性版本效率低很多(在找到值后,各种线程做了很多不必要的工作:看到这个问题),但这不可能是正确的,因为exists在那里。)

于 2012-06-01T01:58:48.893 回答