バックグラウンドから来てJava、私はコレクションを扱う一般的な慣行に慣れています: 明らかに例外がありますが、通常、コードは次のようになります:
public class MyClass {
private Set<String> mySet;
public void init() {
Set<String> s = new LinkedHashSet<String>();
s.add("Hello");
s.add("World");
mySet = Collections.unmodifiableSet(s);
}
}
私は、Scala のオプションの多さに少し当惑していることを告白しなければなりません。がある:
scala.List(およびSeq)scala.collections.Set(およびMap)scala.collection.immutable.Set(そしてMap、StackしかしそうではないList)scala.collection.mutable.Set(そしてMap、BufferしかしそうではないList)scala.collection.jcl
質問です!
- およびがパッケージ
Listで定義されていて、定義されていない のはなぜですか(の実装はコレクションのサブパッケージにあるにもかかわらず)?Seqscalascala.collectionSeq - コレクションを初期化してから凍結するための標準的なメカニズムは何ですか(Java では でラップすることによって実現されます
unmodifiable)。 - 一部のコレクション型 ( など
MultiMap) が変更可能としてのみ定義されているのはなぜですか? (不変はありませんMultiMap)?
Daniel Spiewak のscala コレクションに関する優れたシリーズを読んだことがありますが、実際にそれらを実際にどのように使用するかについてはまだ戸惑っています。以下は、完全なパッケージ宣言が強制されているため、少し扱いにくいようです。
class MyScala {
var mySet: scala.collection.Set[String] = null
def init(): Unit = {
val s = scala.collection.mutable.Set.empty[String]
s + "Hello"
s + "World"
mySet = scala.collection.immutable.Set(s : _ *)
}
}
不変コレクションは変更できないため (Java の場合と同様に、ラッパーの下で基礎となるコレクションを変更することができます) 、これは Java バージョンよりも間違いなく正しいと言えます。unmodifiable