将GenSeq用作“默认”集合类型是最佳做法吗?它似乎是最通用的集合界面。但是我没有在代码示例中看到它被广泛使用(而是使用了更具体的Seq)。
答案 0 :(得分:8)
没有。应该出现在API中的最通用的集合类型是:
Seq
- 顺序收集Set
- 数学集(无重复值)Map
- 关联/关联集(概念上与离散PartialFunction
s相同)唯一对上述区分中性的抽象是Traversable
和Iterable
。 (例如Map[K, V]
同时为Iterable[(K, V)]
和Traversable[(K, V)]
。
如果对实际参数重要的是它的元素可能会以某种(未指定的)顺序进行检查,那么Traversable
会捕获该特征。
包含“Like”或“Once”或“Gen”的类或特征名称是内部魔法的一部分,使得Scala集合展现出“最少惊喜的原则”(其中最主要的是调用HOF的属性)诸如map
或filter
之类的结果产生的结果与匹配的具体类型一样,就像调用HOF的集合一样。
答案 1 :(得分:1)
请注意,考虑到并行集合现在是一个单独的模块,Scala 2.13 (June 2019)不再需要scala/scala-parallel-collections
,GenSeq
因此,不再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