Co to jest odpowiednik konstruktora Scala (aby utworzyć niezmienny HashSet
) do Javy
new HashSet<T>(c)
gdzie c
jest typu Collection<? extends T>
?
Wszystko, co mogę znaleźć w HashSet
Obiekt jest apply
.
Odpowiedzi:
7 dla odpowiedzi № 1Odpowiedzi są podzielone na dwie części. Pierwsza część jest taka, że metody zmiennych zmiennych Scala, które pobierają T *, są słownictwem w stosunku do metod przyjmujących Seq [T]. Mówisz Scali, aby traktowała Seq [T] jako listę argumentów zamiast pojedynczego argumentu używając "seq: _ *".
Druga część polega na konwersji kolekcji [T] naa Seq [T]. W standardowych bibliotekach Scala nie ma jeszcze żadnych ogólnych rozwiązań, ale jednym z bardzo łatwych (jeśli nie koniecznie skutecznych) sposobów jest wywołanie funkcji Array. Oto pełny przykład.
scala> val lst : java.util.Collection[String] = new java.util.ArrayList
lst: java.util.Collection[String] = []
scala> lst add "hello"
res0: Boolean = true
scala> lst add "world"
res1: Boolean = true
scala> Set(lst.toArray : _*)
res2: scala.collection.immutable.Set[java.lang.Object] = Set(hello, world)
Zwróć uwagę, że scala.Predef.Set i scala.collection.immutable.HashSet są synonimami.
11 dla odpowiedzi nr 2
Najbardziej zwięzłym sposobem na to jest prawdopodobnie użycie ++
operator:
import scala.collection.immutable.HashSet
val list = List(1,2,3)
val set = HashSet() ++ list