为什么
List.range(0,100).contains(2)
工作,而
List.range(0,100).par.contains(2)
不是吗?
这是为未来计划的吗?
答案 0 :(得分:10)
非teleological答案是因为contains
在SeqLike
中定义,而在ParSeqLike
中未定义。
如果这不能满足您的好奇心,您可以发现SeqLike
的{{1}}已定义为:
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
所有收藏品GenTraversableOnce
的祖父都定义exists
?可能的原因是contains
Map
在语义上与Set
和Seq
上的方法不同。 Map[A,B]
是Traversable[(A,B)]
,因此如果为contains
定义Traversable
,则contains
需要使用元组(A,B)
参数;但是Map
的{{1}}只需要一个contains
参数。鉴于此,我认为A
应该在contains
中定义 - 也许这是一个可以纠正的疏忽。
(我起初认为并行序列可能没有GenSeqLike
,因为在并行集合上找到目标后搜索要停止的位置比线性版本效率低很多(各种线程做了很多事情)找到值后不必要的工作:请参阅this question),但这可能不对,因为contains
就在那里。)