首页 文章

Scala中Seq和List之间的区别

提问于
浏览
241

我在很多例子中看到有时使用Seq,而其他时候是List ......

除了前一个是Scala类型和List来自Java之外,有什么区别吗?

4 回答

  • 310

    Seq是一个具有已定义元素顺序的Iterable . 序列提供了一种用于索引的方法 apply() ,范围从0到序列的长度 . Seq有许多子类,包括Queue,Range,List,Stack和LinkedList .

    List是一个实现为不可变链表的Seq . 它最适用于具有后进先出(LIFO)访问模式的情况 .

    以下是Scala FAQ的完整集合类层次结构:

  • 10

    SeqList 实现的特征 .

    如果将容器定义为 Seq ,则可以使用任何实现 Seq trait的容器 .

    scala> def sumUp(s: Seq[Int]): Int = { s.sum }
    sumUp: (s: Seq[Int])Int
    
    scala> sumUp(List(1,2,3))
    res41: Int = 6
    
    scala> sumUp(Vector(1,2,3))
    res42: Int = 6
    
    scala> sumUp(Seq(1,2,3))
    res44: Int = 6
    

    注意

    scala> val a = Seq(1,2,3)
    a: Seq[Int] = List(1, 2, 3)
    

    只是一个简短的手:

    scala> val a: Seq[Int] = List(1,2,3)
    a: Seq[Int] = List(1, 2, 3)
    

    如果未指定容器类型,则基础数据结构默认为 List .

  • 41

    在Java术语中,Scala的 Seq 将是Java的 List ,而Scala的 List 将是Java的 LinkedList .

    请注意 Seqtrait ,相当于Java的 interface ,但相当于崭露头角的防御方法 . Scala的 List 是一个由 Nil:: 扩展的抽象类,它们是 List 的具体实现 .

    因此,在Java的 Listinterface 的情况下,Scala的 List 是一个实现 .

    除此之外,Scala的 List 是不可变的,而不是 LinkedList 的情况 . 实际上,Java没有等同于不可变集合(只读事物只保证新对象不能更改,但是你仍然可以改变旧的,因此,"read only"一个) .

    Scala的 List 由编译器和库高度优化,并且它不适合并行编程 . 这些天, Vector 是比 List 更好的选择,但习惯很难打破 .

    Seq 是一个很好的序列推广,所以如果编程到接口,你应该使用它 . 请注意,实际上有三个: collection.Seqcollection.mutable.Seqcollection.immutable.Seq ,后者是导入范围的"default" .

    还有 GenSeqParSeq . 后一种方法在可能的情况下并行运行,而前者是 SeqParSeq 的父级,当代码的并行性还没有使用它们时,它是一种合适的推广 .

  • 16

    在Scala中,List继承自Seq,但实现了Product;这是List的正确定义:

    sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
    

    [注意:the actual definition有点复杂,为了适应和利用Scala非常强大的集合框架 .

相关问题