Wie konvertiert man Scala's scala.List
in Javas Java.util.List
?
Scala List und Java List sind zwei verschiedene Bestien, da die erste unveränderlich und die zweite veränderlich ist. Um also von einer zu einer anderen zu gelangen, müssen Sie zuerst die Scala In eine veränderbare Sammlung aufnehmen.
Ein 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 diesem Beispiel ist asList
jedoch nicht erforderlich, wenn der erwartete Typ Java List
ist, da die Konvertierung implizit ist, wie in der letzten Zeile gezeigt.
Ich bin mir nicht sicher, warum dies noch nicht erwähnt wurde, aber ich denke, der intuitivste Weg ist, die asJava
Decorator-Methode von JavaConverters direkt auf der Scala) aufzurufen = 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]
Angenommen, wir haben die folgenden List
:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Wenn Sie explizit und gena 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:
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 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)
pdate
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]
Beginnend Scala 2.13
, das Paket scala.jdk.CollectionConverters
liefert 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]
Bei einzelnen Aufrufen ist dies möglicherweise die einfachste Lösung:
val slist = List (1, 2, 3, 4)
val jl = new Java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
Ich habe die Leistung nicht gemessen.
Wenn Sie wie oben beschrieben vorgehen, wird eine unveränderliche Liste auch auf der Seite Java) erstellt. Die einzige funktionierende Lösung, die ich gefunden habe, ist die folgende:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}