web-dev-qa-db-ja.com

ScalaのSeqとListの違い

私は多くの例でSeqが時々使われているのを見たことがありますが、それ以外の時はListです。

前のものがScala型で、ListがJavaから来ていること以外に何か違いはありますか?

259
opensas

Javaの用語では、ScalaのSeqはJavaのListになり、ScalaのListはJavaのLinkedListになります。

Seqtraitであることに注意してください。これはJavaのinterfaceと同等ですが、今後注目されるディフェンダーメソッドと同等のものです。 ScalaのListは、Nilの具体的な実装であるListおよび::によって拡張される抽象クラスです。

つまり、JavaのListinterfaceの場合、ScalaのListは実装です。

それ以上に、ScalaのListは不変です。これはLinkedListの場合ではありません。実際、Javaには不変のコレクションに相当するものはありません(読み取り専用で新しいオブジェクトを変更できないことが保証されているだけですが、古いオブジェクト、つまり「読み取り専用」コレクションを変更することはできます)。

ScalaのListはコンパイラとライブラリによって非常に最適化されており、関数型プログラミングにおける基本的なデータ型です。しかし、それには限界があり、並列プログラミングには不十分です。最近では、VectorListよりも良い選択ですが、習慣を破るのは難しいです。

Seqはシーケンスの一般化に適しているため、インターフェイスにプログラムする場合はそれを使用する必要があります。 collection.Seqcollection.mutable.Seq、およびcollection.immutable.Seqの3つが実際にあることに注意してください。スコープにインポートされる「デフォルト」は後者です。

GenSeqParSeqもあります。後者は可能な限り並列に実行されますが、前者はSeqParSeqの両方の親であり、コードの並列処理が重要でない場合に適した一般化です。それらはどちらも比較的新しく導入されたものなので、人々はまだそれらをあまり使っていません。

346

A Seq は要素の順序が定義されたIterableです。シーケンスはインデックス付けのためのメソッドapply()を提供します。範囲は0からシーケンスの長さまでです。 Seqには、Queue、Range、List、Stack、およびLinkedListを含む多数のサブクラスがあります。

A List は不変のリンクリストとして実装されているSeqです。後入れ先出し(LIFO)アクセスパターンを使用する場合に最適です。

これは Scala FAQ からの完全なコレクションクラス階層です。

enter image description here

59
Ceasar Bautista

Scalaでは、ListはSeqを継承しますが、 Product を実装します。これが List の正しい定義です。

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

[注: 実際のの定義 は、Scalaのものに適合してそれを利用するために、少し複雑です。強力なコレクションフレームワーク。

17
zakelfassi

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になります。

13
Akavall

@ daniel-c-sobralが言ったように、Listは特性Seqを拡張し、scala.collection.immutable.$colon$colon(または略して::)によって実装される抽象クラスですが、技術的なことは別として、使用するリストとseqsのほとんどはSeq(1, 2, 3)またはList(1, 2, 3)の形式で初期化され、両方ともscala.collection.immutable.$colon$colonを返すため、次のように記述できます。

var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]

その結果、重要なことは公開するメソッドだけであると主張します。たとえば、リストの::を使用すると、SeqとIの+:で冗長になることがありますデフォルトでは、Seqに個人的にこだわります。

0
Profiterole