加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:52:43 所属栏目:安全 来源:网络整理
导读:为什么 List.range(0,100).contains(2) 工作,而 List.range(0,100).par.contains(2) 才不是? 这计划在未来? 解决方法 非 teleological答案是因为包含在SeqLike中定义但在ParSeqLike中没有定义. 如果这不能满足您的好奇心,您可以发现SeqLike的包含是这样定
为什么

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

工作,而

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

才不是?

这计划在未来?

解决方法

非 teleological答案是因为包含在SeqLike中定义但在ParSeqLike中没有定义.

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

def contains(elem: Any): Boolean = exists (_ == elem)

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

List.range(0,100).par.exists(_ == 2)

ParSeqLike也缺少其他一些方法,其中一些方法难以有效实现(例如indexOfSlice),而另一些则由于不太明显的原因(例如组合 – 可能因为它仅对小数据集有用).但是如果你有一个并行集合,你也可以使用.seq来回到线性版本并获取你的方法:

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

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

这也提出了一个问题,为什么在SeqLike上定义包含而不是在所有集合的Granddaddy,GenTraversableOnce,你发现存在?可能的原因是Map的包含在语义上是与Set和Seq上的方法不同的方法. Map [A??,B]是Traversable [(A,B)],因此如果为Traversable定义了contains,则需要包含一个元组(A,B)参数;但是Map的contains只包含一个A参数.鉴于此,我认为应该在GenSeqLike中定义包含 – 也许这是一个将被纠正的疏忽.

(我想起初可能并行序列没有包含因为在并行集合上找到目标之后要搜索的位置比线性版本效率低得多(各种线程在值之后执行了大量不必要的工作)发现:见this question),但那可能不对,因为存在.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读