Исходя из фона 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
)