Powiązane z pytaniem o przepełnienie stosu Scala odpowiednik nowego zestawu HashSet (kolekcja) , jak przekonwertować kolekcję Java ( java.util.List
powiedzmy) na kolekcję Scala List
?
W rzeczywistości próbuję przekonwertować wywołanie Java API na Springa SimpleJdbcTemplate
, które zwraca java.util.List<T>
, na niezmienny Scala HashSet
. Na przykład:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
To wydaje się działać. Krytyka jest mile widziana!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
java
scala
scala-collections
scala-2.7
oxbow_lakes
źródło
źródło
Na przyszłość: w Scali 2.8 można to zrobić w następujący sposób:
import scala.collection.JavaConversions._ val list = new java.util.ArrayList[String]() list.add("test") val set = list.toSet
set
jestscala.collection.immutable.Set[String]
po tym.Zobacz również odpowiedź Bena Jamesa, aby uzyskać bardziej wyraźny sposób (użycie JavaConverters), który wydaje się być teraz zalecany.
źródło
JavaConversions
ma pewne implikacje, które sprawiają, żetoSet
połączenie nie jest konieczne.Jeśli chcesz być bardziej wyraźny niż JavaConversions pokazane w odpowiedzi robinst , możesz użyć JavaConverters:
import scala.collection.JavaConverters._ val l = new java.util.ArrayList[java.lang.String] val s = l.asScala.toSet
źródło
JavaConversions ( odpowiedź robinst ) i JavaConverters (odpowiedź Bena Jamesa ) zostały wycofane ze Scala 2.10 .
Zamiast JavaConversions użyj:
import scala.collection.convert.wrapAll._
zgodnie z sugestią aleksandr_hramcov .
Zamiast JavaConverters użyj:
import scala.collection.convert.decorateAll._
W obu przypadkach istnieje również możliwość zaimportowania samych konwersji / konwerterów odpowiednio do Javy lub Scali, np .:
import scala.collection.convert.wrapAsScala._
Aktualizacja: powyższe stwierdzenie, że JavaConversions i JavaConverters zostały wycofane, wydaje się być błędne. W Scali 2.10 istniały przestarzałe właściwości, co spowodowało ostrzeżenia o wycofaniu podczas ich importowania. Więc alternatywne importy tutaj wydają się być tylko aliasami. Chociaż nadal je wolę, ponieważ IMHO nazwy są bardziej odpowiednie.
źródło
Możesz również chcieć zbadać tę doskonałą bibliotekę: kolekcję scalaj, która ma dwukierunkową konwersję między kolekcjami Java i Scala. W twoim przypadku, aby przekonwertować java.util.List na Scala List, możesz to zrobić:
val list = new java.util.ArrayList[java.lang.String] list.add("A") list.add("B") list.asScala
źródło
Uruchamianie
Scala 2.13
, pakietscala.jdk.CollectionConverters
zastępuje pakietyscala.collection.JavaConverters/JavaConversions._
:import scala.jdk.CollectionConverters._ // val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three") javaList.asScala // collection.mutable.Buffer[String] = Buffer("one", "two", "three") javaList.asScala.toSet // collection.immutable.Set[String] = Set("one", "two", "three")
źródło
val array = java.util.Arrays.asList("one","two","three").toArray val list = array.toList.map(_.asInstanceOf[String])
źródło
Możesz dodać informacje o typie w wywołaniu toArray, aby ustawić parametry zestawu:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Może to być korzystne, ponieważ pakiet zbiory przeżywa poważnych przeróbek do Scala 2.8 i pakiet scala.collection.jcl jest odchodzi
źródło
Możesz przekonwertować kolekcję Java na tablicę, a następnie utworzyć listę Scala z tego:
val array = java.util.Arrays.asList("one","two","three").toArray val list = List.fromArray(array)
źródło
Inny prosty sposób rozwiązania tego problemu:
import collection.convert.wrapAll._
źródło