回答:
Javaの用語では、ScalaのSeq
JavaのだろうList
、とScalaのはList
、JavaのだろうLinkedList
。
注Seq
あるtrait
Javaのと同じです、interface
しかし、新進気鋭のDF法の同等と。Scala List
は、Nil
とによって拡張される抽象クラス::
であり、の具体的な実装です。List
。
つまり、Java List
がであるinterface
場合、Scala List
は実装です。
さらに、Scala List
は不変ですLinkedList
。これはの場合とは異なります。実際、Javaには不変のコレクションに相当するものはありません(読み取り専用のものは、新しいオブジェクトを変更できないことを保証するだけですが、古いオブジェクトを変更できるため、「読み取り専用」のものを変更できます)。
Scala List
はコンパイラとライブラリによって高度に最適化されており、関数型プログラミングの基本的なデータ型です。ただし、制限があり、並列プログラミングには不十分です。最近でVector
は、がより良い選択ですList
が、習慣を破るのは難しいです。
Seq
シーケンスの一般化に適しているため、インターフェイスにプログラミングする場合は、それを使用する必要があります。:そこにそれらの3が実際にあることに注意してくださいcollection.Seq
、collection.mutable.Seq
そしてcollection.immutable.Seq
、それはスコープにインポート「デフォルト」である後者の一つです。
GenSeq
ともありParSeq
ます。前者は両方の親であるが、後者の方法は、並列可能な場合に実行するSeq
とParSeq
、コードの並列性は問題ではない場合に適した一般化です。どちらも比較的新しく導入されたため、まだあまり使用されていません。
UnsupportedOperationException
と、このためにヒットする可能性があります。Javaで不変のリストを作成するには、Collections.unmodifiableList()を使用します。同様に、セット、マップなどの他のメソッドがあります。docs.oracle.com
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
ご了承ください
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
ます。
@ daniel-c-sobralが言ったように、Listは特性Seqを拡張し、scala.collection.immutable.$colon$colon
(または::
略して)実装された抽象クラスですが、専門性はさておき、使用するリストとseqのほとんどは、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から::
冗長であることがわかったfrom Listを使用して+:
、デフォルトで個人的にSeqに固執することができます。
String
コレクションではありません、それはJavaプログラマに馴染みの不変クラスの一例です。