So konvertieren Sie Scalas scala.List
in Javas java.util.List
?
Wie konvertiert man eine scala.List in eine java.util.List?
Alex Baranoski
Ich bin mir nicht sicher, warum dies noch nicht erwähnt wurde, aber ich denke, der intuitivste Weg ist, die aufzurufen asJava
Dekorateur-Methode von JavaConverter direkt auf der Scala-Liste:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
-
Es erfordert auch, dass Sie explizit sind, anstatt sich auf implizite Magie zu verlassen, die irgendwann unerwünscht sein könnte.
– Kamil Lelonek
28. November 2014 um 11:56 Uhr
-
Dies verursacht Probleme, wenn die Liste für die spätere Verwendung in Java-Code serialisiert wird … es führt zu ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList(foo : _*) funktioniert in diesem Fall.
– Mohan
27. Juni 2015 um 11:41 Uhr
-
Ich komme jedes Mal auf diese Seite, wenn ich Java in Scala verwenden muss. Leider gibt es keine Möglichkeit, mir einen geeigneten Importvorschlag für “.asJava” vorzuschlagen ((
– Mulja
13. September 2019 um 9:20 Uhr
Daniel C. Sobral
Scala List und Java List sind zwei verschiedene Bestien, da Ersteres unveränderlich und Letzteres veränderlich ist. Um also von einem zum anderen zu gelangen, müssen Sie zuerst die Scala-Liste in eine veränderliche Sammlung konvertieren.
Auf Scala 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
Ab Scala 2.8:
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
asList(ListBuffer(List(1,2,3): _*))
val x: java.util.List[Int] = ListBuffer(List(1,2,3): _*)
Jedoch, asList
in diesem Beispiel ist nicht erforderlich, wenn der erwartete Typ Java ist List
da die Konvertierung implizit ist, wie die letzte Zeile zeigt.
-
Der Wert x: java.util.List[Int] ist immer noch unveränderlich. Versuchen Sie es einfach in Java mit x.add(something) – es wird einen Fehler auslösen
– Vitamin
8. Mai 2013 um 12:48 Uhr
-
@Vitamon Es gibt keinen Fehler für mich aus – ich habe es nur zur Bestätigung getestet.
– Daniel C. Sobral
8. Mai 2013 um 16:46 Uhr
-
Verworfen zugunsten von
scala.collection.JavaConverters
ab 2.12– Jeroen Kransen
4. Februar 2019 um 13:54 Uhr
-
für 2.12.1 hatte ich beim sofortigen Iterieren über die Java-Liste mit einer Scala-for-Schleife mehr Glück mit asScalaBuffer() im JavaConverters-Paket: scala-lang.org/api/2.12.1/scala/collection/JavaConverters$.html
– Sarah Messer
4. September 2019 um 13:43 Uhr
Um die bisherigen Antworten zusammenzufassen
Angenommen wir haben folgendes List
:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Wenn du sein willst explizit und genau sagen was du umwandeln willst:
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
Wenn du Ich möchte keine Conversions mitsteuern und Compiler machen lassen implizit Arbeite für dich:
scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._
scala> val javaList: java.util.List[Int] = scalaList
javaList: java.util.List[Int] = [1, 2, 3]
Es liegt an Ihnen, wie Sie Ihren Code steuern möchten.
Xavier Guihot
Beginnend Scala 2.13
das Paket scala.jdk.CollectionConverters
bietet asJava
über einen Zuhälter von Seq
und ersetzt Pakete scala.collection.JavaConverters/JavaConversions
:
import scala.jdk.CollectionConverters._
// val scalaList: List[Int] = List(1, 2, 3)
scalaList.asJava
// java.util.List[Int] = [1, 2, 3]
Ziemlich alte Fragen, obwohl ich sie beantworten werde, gegeben, aber die meisten Vorschläge sind veraltet.
import scala.collection.JavaConversions.seqAsJavaList
val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
-
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
– Prayagupa
13. Juni 2017 um 23:42 Uhr
Guillaume Masse
Aktualisieren
mit Scala 2.9.2:
import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )
Ergebnis
[1, 2, 3]
-
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
– Prayagupa
13. Juni 2017 um 23:42 Uhr
Stefan W.
Für einzelne Aufrufe ist es möglicherweise die einfachste Lösung, dies von Hand zu tun:
val slist = List (1, 2, 3, 4)
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
Leistung habe ich nicht gemessen.
Alter … ändere die akzeptierte Antwort … (bitte)
– fletch
7. Dezember 2018 um 1:19 Uhr