我应该默认使用GenSeq吗?

时间:2013-01-27 18:02:15

标签: scala collections

将GenSeq用作“默认”集合类型是最佳做法吗?它似乎是最通用的集合界面。但是我没有在代码示例中看到它被广泛使用(而是使用了更具体的Seq)。

3 个答案:

答案 0 :(得分:8)

没有。应该出现在API中的最通用的集合类型是:

  • Seq - 顺序收集
  • Set - 数学集(无重复值)
  • Map - 关联/关联集(概念上与离散PartialFunction s相同)

唯一对上述区分中性的抽象是TraversableIterable。 (例如Map[K, V]同时为Iterable[(K, V)]Traversable[(K, V)]

如果对实际参数重要的是它的元素可能会以某种(未指定的)顺序进行检查,那么Traversable会捕获该特征。

包含“Like”或“Once”或“Gen”的类或特征名称是内部魔法的一部分,使得Scala集合展现出“最少惊喜的原则”(其中最主要的是调用HOF的属性)诸如mapfilter之类的结果产生的结果与匹配的具体类型一样,就像调用HOF的集合一样。

答案 1 :(得分:1)

请注意,考虑到并行集合现在是一个单独的模块,Scala 2.13 (June 2019)不再需要scala/scala-parallel-collectionsGenSeq

因此,不再GenSeq(或任何Genxxx

  

要依赖sbt中的scala-parallel-collections,请将其添加到build.sbt中:

libraryDependencies +=
  "org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0"
  

在您的代码中,添加以下导入:

import scala.collection.parallel.CollectionConverters._

答案 2 :(得分:0)

是。 Seq用于非并行(顺序)序列集合。

GenSeq是平行和正常序列的共同特征。

ParSeq是非顺序序列(Pun意图),使用并行性实现。

GenSeq中缺少一些方法(比较包含),但根据我的经验,它们可以手工实现(您可以尝试查看Seq中的实现)。

来源:https://docs.scala-lang.org/overviews/parallel-collections/architecture.html

关于scala集合的另一个好页面(非并行的):https://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html