Wie ein scala.List zu einem java.util.List konvertieren?
-
19-09-2019 - |
Frage
Wie Scala scala.List
in Java java.util.List
konvertieren?
Lösung
Scala Liste und Java-Liste sind zwei verschiedene Tiere, weil erstere unveränderlich ist und letztere ist wandelbar. Also, von einem zum anderen zu gelangen, müssen Sie zuerst die Scala-Liste in eine veränderbare Sammlung umwandeln.
Auf Scala 2.7:
import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))
Von Scala 2.8 ab:
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): _*)
Allerdings asList
in diesem Beispiel ist nicht erforderlich, wenn der erwartete Typ ein Java List
ist, wie die Umwandlung implizit ist, wie sie in der letzten Zeile gezeigt.
Andere Tipps
Nicht sicher, warum dies wurde nicht erwähnt vor, aber ich denke, die intuitive Art und Weise ist es, die asJava
Dekorateur Methode von JavaConverters direkt an 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]
Um die bisherigen Antworten
resümiert Unter der Annahme, wir folgende List
haben:
scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)
Wenn Sie wollen explizite und genau sagen, , 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 nicht wollen, Co Steuer Conversions und lassen Compiler make implizite Arbeit für Sie:
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 ist an Ihnen, wie Sie Ihren Code steuern möchten.
Pretty alte Fragen, obwohl ich beantworten, da aber die meisten Vorschläge sind veraltet.
import scala.collection.JavaConversions.seqAsJavaList
val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
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]
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]
Für einzelne Anrufungen, es von Hand tun könnte die einfachste Lösung sein:
val slist = List (1, 2, 3, 4)
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))
Ich habe nicht die Leistung messen.
Wie oben erzeugt auf Java-Seite auch unveränderliche Liste vorgeschlagen tun. Die einzige funktionierende Lösung, die ich gefunden habe, ist dies:
def toJList[T](l:List[T]):util.List[T] = {
val a = new util.ArrayList[T]
l.map(a.add(_))
a
}
Da Scala 2.12.0 JavaConversions wurde veraltet.
So ist die einfachste Lösung für mich war:
java.util.Arrays.asList("a","b","c")