多くの例で、Seq が使用されている場合もあれば、List が使用されている場合もあります...
前者が Scala 型であり、リストが Java から来ていること以外に、何か違いはありますか?
ベストアンサー1
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
はシーケンスの適切な一般化なので、インターフェースをプログラムする場合は、これを使用する必要があります。実際には、、、の 3 つがあり、スコープにインポートされる「デフォルト」は後者であることにcollection.mutable.Seq
注意collection.immutable.Seq
してください。
GenSeq
また、 ともありますParSeq
。後者のメソッドは可能な場合は並列に実行されますが、前者は と の両方の親でありSeq
、ParSeq
コードの並列性が考慮されていない場合に適した一般化です。どちらも比較的新しいため、あまり使用されていません。