我应该默认使用GenSeq吗?

问题描述 投票:5回答:2

将GenSeq用作“默认”集合类型是最佳做法吗?它似乎是最通用的集合界面。但是我没有看到它在代码示例中广泛使用(更具体的Seq用于代替)。

scala collections
2个回答
8
投票

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

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

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

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

包含“Like”或“Once”或“Gen”的类或特征名称是内部魔法的一部分,使得Scala集合展现出“最少惊喜的原则”(其中主要是在其上调用HOF的属性,例如mapfilter产生的结果与匹配的具体类型一样,就像调用HOF的集合一样。


0
投票

是。 Seq用于非并行(顺序)序列集合。

GenSeq是平行和正常序列的共同特征。

ParSeq是非顺序序列(Pun意图),它是使用并行性实现的。

GenSeq中缺少一些方法(Like contains),但根据我的经验,它们可以手工实现(您可以尝试查看Seq中的实现)。

资料来源:https://docs.scala-lang.org/overviews/parallel-collections/architecture.html

关于scala集合的另一个好页面(非平行的):https://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html

© www.soinside.com 2019 - 2024. All rights reserved.