【发布时间】:2013-01-27 18:02:15
【问题描述】:
将 GenSeq 用作“默认”集合类型是否是最佳实践?它似乎是最通用的集合接口。但是我没有看到它在代码示例中被广泛使用(而是使用更具体的 Seq)。
【问题讨论】:
-
我会说,它真的取决于,如果您希望您的代码同时处理顺序和并行集合,我认为您可以使用它。
标签: scala collections
将 GenSeq 用作“默认”集合类型是否是最佳实践?它似乎是最通用的集合接口。但是我没有看到它在代码示例中被广泛使用(而是使用更具体的 Seq)。
【问题讨论】:
标签: scala collections
没有。 API 中应该出现的最通用的集合类型是:
Seq — 顺序收集Set — 数学集(无重复值)Map — 关联/关联集(概念上与离散的 PartialFunctions 相同)与上述区别无关的唯一抽象是Traversable 和Iterable。 (例如,Map[K, V] 既是 Iterable[(K, V)] 又是 Traversable[(K, V)]。
如果对于一个实际参数而言,重要的是它的元素可以按某种(未指定的)顺序进行检查,那么Traversable 捕获了该特征。
包含“Like”、“Once”或“Gen”的类或特征名称是使 Scala 集合表现出“最小意外原则”的内部魔法的一部分(其中最主要的是调用 HOF 的属性)它们(例如 map 或 filter 会产生与调用该 HOF 的集合的具体类型匹配的结果)。
【讨论】:
请注意,Scala 2.13 (June 2019) 不再需要 GenSeq,考虑到并行集合现在是一个单独的模块: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
【讨论】: