【问题标题】:Should I use GenSeq by default?我应该默认使用 GenSeq 吗?
【发布时间】:2013-01-27 18:02:15
【问题描述】:

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

【问题讨论】:

  • 我会说,它真的取决于,如果您希望您的代码同时处理顺序和并行集合,我认为您可以使用它。

标签: scala collections


【解决方案1】:

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

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

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

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

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

【讨论】:

【解决方案2】:

请注意,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._

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多