ope*_*sas 279 collections scala list seq
我在很多例子中看到有时使用Seq,而其他时候是List ......
除了前一个是Scala类型和List来自Java之外,有什么区别吗?
Dan*_*ral 378
用Java术语来说,Scala Seq
是Java List
,而Scala List
是Java LinkedList
.
请注意,这Seq
是一个trait
等同于Java的interface
,但具有相当于崭露头角的防御方法.Scala的List
是受扩展的抽象类Nil
和::
,它们是的具体实现List
.
所以,在Java List
是的地方interface
,Scala List
是一个实现.
除此之外,Scala List
是不可改变的,事实并非如此LinkedList
.事实上,Java没有相当于不可变的集合(只读的东西只保证新对象不能改变,但你仍然可以改变旧的,因此,"只读"一个).
Scala List
是由编译器和库高度优化的,它是函数式编程中的基本数据类型.但是,它有局限性,并不适合并行编程.这些天,Vector
是比较好的选择List
,但习惯很难打破.
Seq
对序列是一个很好的推广,所以如果编程到接口,你应该使用它.请注意,实际上他们三个分别是:collection.Seq
,collection.mutable.Seq
而且collection.immutable.Seq
,它是后者的一个是"默认"导入范围.
还有GenSeq
和ParSeq
.后一种方法尽可能并行运行,而前者是两者的父对象,Seq
并且ParSeq
当代码的并行性无关紧要时,它是一种合适的推广.它们都是相对较新引入的,所以人们还没有使用它们.
Cea*_*sta 74
甲SEQ是一个可迭代具有定义的元素的顺序.序列提供了一种apply()
索引方法,范围从0到序列的长度.Seq有许多子类,包括Queue,Range,List,Stack和LinkedList.
一个列表是作为不可改变的链表实现的序列.它最适用于具有后进先出(LIFO)访问模式的情况.
以下是Scala FAQ中的完整集合类层次结构:
Aka*_*all 20
Seq
是一种List
实现的特征.
如果将容器定义为Seq
,则可以使用任何实现Seq
特征的容器.
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
Run Code Online (Sandbox Code Playgroud)
注意
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
只是一个简短的手:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如果未指定容器类型,则基础数据结构默认为List
.
zak*_*ssi 18
在Scala中,List继承自Seq,但实现了Product ; 这是List的正确定义:
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
Run Code Online (Sandbox Code Playgroud)
[注意:为了适应并利用Scala非常强大的集合框架,实际定义有点复杂.]