Frage

Wie Scala scala.List in Java java.util.List konvertieren?

War es hilfreich?

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")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top