我应该在内部使用Sequence然后转换为List

时间:2017-01-17 18:50:58

标签: scala

我的API是否应该为集合公开List / Vector,但是如果我使用大多数集合类型中的泛型方法,我应该在内部使用Seq作为我的集合吗?

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题:你应该使用最简单的类型来完成你需要的一切 - 所以你的API和内部代码应尽可能使用Seq over List / Vector。这意味着如果您不必

,则不要对实现做出假设

答案 1 :(得分:2)

  

我使用的是大多数集合类型中的通用方法

对于这些方法,我实际建议使用scala.collection.GenSeq。 如果你想重复使用你的方法让我们说顺序处理你的序列怎么办?在这种情况下scala.collection.Seq是不够的,因为scala.collection.parallel.ParSeq无法传递给同一个方法。例如:

def sumAll(seq: Seq[Int]): Int = seq.sum

现在您想让客户端能够使用此方法进行并行计算,您可以引入新的" generic"方法喜欢:

def sumAllPar(seq: Seq[Int]): Int = seq.par.sum

或使您的方法真正通用设计

def sumAll(seq: GenSeq[Int]): Int = seq.sum

在这种情况下,以下调用有效:

sumAll(Seq(1,2,3))
sumAll(Seq(1,2,3).par)
  

我的API是否应公开集合的List / Vector

同样的说法只考虑一件事:限制具有更具体类型的用法(即:Seq - 您不希望并行调用方法,{{1} - 需要索引访问权限等等。)