7

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

4

3 回答 3

10

不,应该出现在 API 中的最通用的集合类型是:

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

与上述区别无关的唯一抽象是TraversableIterable。(例如Map[K, V],两者都是Iterable[(K, V)]Traversable[(K, V)]

如果对一个实际参数来说最重要的是它的元素可以以某种(未指定的)顺序检查,然后Traversable捕获该特征。

包含“Like”、“Once”或“Gen”的类或特征名称是使 Scala 集合表现出“最小意外原则”的内部魔法的一部分(其中最主要的是在它们上调用 HOF 的属性,例如mapfilter产生一个与调用该 HOF 的集合匹配的具体类型的结果)。

于 2013-01-27T20:43:00.303 回答
4

请注意,您不再需要GenSeqScala 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._
于 2019-06-11T08:00:18.573 回答
0

是的。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

于 2018-06-11T07:10:40.373 回答