Исходя из фона 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иSeqопределены в пакетеscala, а неscala.collection(даже если реализацииSeqнаходятся в подпакетах коллекции)? - Каков стандартный механизм инициализации коллекции, а затем ее замораживание (что в 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)