Wie konvertiere ich Scala scala.List
in Java java.util.List
?
Wie konvertiere ich Scala scala.List
in Java java.util.List
?
Antworten:
Scala List und Java List sind zwei verschiedene Tiere, da das erstere unveränderlich und das letztere veränderlich ist. Um von einem zum anderen zu gelangen, müssen Sie zuerst die Scala-Liste in eine veränderbare 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): _*)
In asList
diesem Beispiel ist dies jedoch nicht erforderlich, wenn der erwartete Typ Java ist List
, da die Konvertierung implizit ist, wie in der letzten Zeile gezeigt.
scala.collection.JavaConverters
ab 2.12
Ich bin mir nicht sicher, warum dies noch nicht erwähnt wurde, aber ich denke, der intuitivste Weg ist, die asJava
Dekorationsmethode von JavaConverters direkt in der Scala-Liste aufzurufen :
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]
Angenommen, wir haben Folgendes List
:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Wenn Sie explizit sein und genau angeben möchten, was Sie konvertieren möchten:
scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._
scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]
Wenn Sie keine Co-Control-Konvertierungen wünschen und den Compiler implizit für Sie arbeiten lassen möchten :
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.
Ziemlich alte Fragen, die ich zwar beantworten werde, 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
Starten Scala 2.13
, das Paket scala.jdk.CollectionConverters
bietet asJava
über einen Zuhälter von Seq
und ersetzt Paketen 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]
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]
Seit Scala 2.12.0 ist JavaConversions veraltet.
Die einfachste Lösung für mich war also:
java.util.Arrays.asList("a","b","c")
import scala.collection.JavaConverters._
für 2.12.4