Konvertieren einer Java-Sammlung in einer Scala Kollektion
-
21-08-2019 - |
Frage
In Verbindung stehende Überlauf Frage Stack Scala äquivalent neuen HashSet (Sammlung) , wie kann ich konvertieren eine Java-Sammlung (java.util.List
sagen) in eine Scala Sammlung List
?
Ich versuche eigentlich eine Java-API-Aufruf zu konvertieren href="http://en.wikipedia.org/wiki/Spring_Framework" rel="noreferrer"> Spring SimpleJdbcTemplate
zum java.util.List<T> zurück in eine Scala unveränderlich HashSet
. So zum Beispiel:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Das scheint zu funktionieren. Kritik ist willkommen!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
Lösung
Ihr letzter Vorschlag funktioniert, aber Sie können auch vermeiden jcl.Buffer
mit:
Set(javaApi.query(...).toArray: _*)
Beachten Sie, dass scala.collection.immutable.Set
ist standardmäßig dank Predef.scala
zur Verfügung gestellt.
Andere Tipps
Für die Zukunft: Mit Scala 2.8, könnte es wie folgt geschehen:
import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
set
ist ein scala.collection.immutable.Set[String]
danach.
Auch Ben James' Antwort für mehr sehen explizite Art und Weise (mit JavaConverters), die jetzt empfohlen zu sein scheint.
Wenn Sie mehr explizit sein wollen als die JavaConversions in robinst des demonstriert beantworten , können Sie JavaConverters verwenden:
import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
JavaConversions ( robinst Antwort ) und JavaConverters ( Ben James Antwort ) wurden als veraltet mit Scala 2.10 .
Anstelle von JavaConversions Verwendung:
import scala.collection.convert.wrapAll._
wie von aleksandr_hramcov .
Anstelle von JavaConverters Verwendung:
import scala.collection.convert.decorateAll._
Für beide gibt es auch die Möglichkeit, die Wandlungen / Konverter zu Java oder Scala nur zu importieren bzw. z.
import scala.collection.convert.wrapAsScala._
Update: Die Aussage über das JavaConversions und JavaConverters wurden als veraltet scheint falsch zu sein. Es gab einige veraltete Objekte in Scala 2.10, die in deprecation Warnungen ergaben sich, wenn sie zu importieren. So sind die alternativen Importe hier scheinen nur Aliase zu sein. Obwohl ich sie immer noch lieber, als IMHO sind die Namen besser geeignet.
Sie können auch diese ausgezeichnete Bibliothek erkunden wollen: scalaj-Sammlung , die Zwei-Wege hat zwischen Java und Scala Sammlungen Konvertierung. In Ihrem Fall eine java.util.List zu Scala Liste konvertieren Sie dies tun können:
val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray
val list = array.toList.map(_.asInstanceOf[String])
Sie können die Typinformationen in der hinzufügen toArray das Set parametriert werden, um zu nennen:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Dies könnte vorteilhaft sein, da die Sammlung Paket ist für Scala 2.8 durch eine große Nacharbeit zu gehen und das scala.collection.jcl Paket ist weggeht
Eine weitere einfache Möglichkeit, dieses Problem zu lösen:
import collection.convert.wrapAll._
Sie können die Java-Sammlung in ein Array umwandeln und dann eine Scala Liste aus, dass erstellen:
val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
Starten Scala 2.13
, Paket scala.jdk.CollectionConverters
ersetzt Pakete scala.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")