来自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包装器下更改底层集合)