将 GenSeq 用作“默认”集合类型是否是最佳实践?它似乎是最通用的集合接口。但是我没有看到它在代码示例中被广泛使用(而是使用更具体的 Seq)。
3 回答
不,应该出现在 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 的集合匹配的具体类型的结果)。
请注意,您不再需要GenSeq
Scala 2.13 (June 2019),因为 Parallel 集合现在是一个单独的模块:scala/scala-parallel-collections
所以没有更多GenSeq
(或任何Genxxx
)
要依赖 sbt 中的 scala-parallel-collections,请将其添加到您的 build.sbt:
libraryDependencies +=
"org.scala-lang.modules" %% "scala-parallel-collections" % "0.2.0"
在您的代码中,添加此导入:
import scala.collection.parallel.CollectionConverters._
是的。Seq 用于序列的非并行(Sequential)集合。
GenSeq 是平行序列和正常序列之间的共同特征。
ParSeq 是使用并行性实现的非顺序序列(双关语)。
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