Viniendo de un fondo Java
, estoy acostumbrado a la práctica común de hacer frente a las colecciones: es evidente que no habría excepciones, pero por lo general el código se vería así:colección Scala práctica estándar
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);
}
}
Tengo que confesar que Estoy un poco aturdido por la gran cantidad de opciones en Scala. No:
scala.List
(ySeq
)scala.collections.Set
(yMap
)scala.collection.immutable.Set
(yMap
,Stack
pero noList
)scala.collection.mutable.Set
(yMap
,Buffer
pero noList
)scala.collection.jcl
¡Preguntas!
- ¿Por qué
List
ySeq
definido en el paquetescala
y noscala.collection
(a pesar de que las implementaciones deSeq
están en las sub-paquetes de colecciones)? - cuál es el mecanismo estándar para iniciando una colección y luego congelar (lo que en Java se encierra en un
unmodifiable
)? - ¿Por qué algunos tipos de colección (por ejemplo,
MultiMap
) solo se definen como mutables? (No hay inmutableMultiMap
)?
He leído Daniel Spiewak's excellent series on scala collections y todavía estoy desconcertado por cómo uno realmente los usaría en la práctica. El siguiente parece un poco difícil de manejar debido a las declaraciones de paquete completo forzadas:
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 : _ *)
}
}
Aunque podría decirse que esto es más correcto que la versión Java como la colección inmutable no puede cambiar (como en el caso de Java, donde la colección subyacente podría alterarse envoltorio debajo del unmodifiable
)
Supongo que es más probable que el bucle atraviese algo y lo agregue al conjunto, en lugar de solo un grupo de valores. – runT1ME