Wie konvertiere ich eine scala.List in eine java.util.List?

112

Wie konvertiere ich Scala scala.Listin Java java.util.List?

Alex Baranosky
quelle
3
Alter ... ändere die akzeptierte Antwort ... (bitte)
sfletche

Antworten:

69

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 asListdiesem Beispiel ist dies jedoch nicht erforderlich, wenn der erwartete Typ Java ist List, da die Konvertierung implizit ist, wie in der letzten Zeile gezeigt.

Daniel C. Sobral
quelle
Das val x: java.util.List [Int] ist immer noch unveränderlich. Versuchen Sie einfach in Java x.add (etwas) - es wird Fehler werfen
Vitamon
1
@Vitamon Es gibt keinen Fehler für mich - ich habe es nur getestet, um es zu bestätigen.
Daniel C. Sobral
4
Veraltet zugunsten von scala.collection.JavaConvertersab 2.12
Jeroen Kransen
Für 2.12.1 hatte ich beim sofortigen Durchlaufen der 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
165

Ich bin mir nicht sicher, warum dies noch nicht erwähnt wurde, aber ich denke, der intuitivste Weg ist, die asJavaDekorationsmethode 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]
dimitrisli
quelle
6
Es erfordert auch, dass Sie explizit sind, anstatt sich auf implizite Magie zu verlassen, die irgendwann unerwünscht sein könnte.
Kamil Lelonek
Dies führt zu Problemen, wenn die Liste für die spätere Verwendung in Java-Code serialisiert wird. Dies führt zu ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) funktioniert in diesem Fall.
Mohan
Ich komme jedes Mal auf diese Seite, wenn ich Java in Scala verwenden muss. Leider gibt es keine Möglichkeit, mir einen richtigen Importvorschlag für ".asJava" vorzuschlagen ((
mulya
24

Um die vorherigen Antworten zusammenzufassen

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.

Kamil Lelonek
quelle
7

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)
Shirish Kumar
quelle
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
Prayagupd
7

Starten Scala 2.13, das Paket scala.jdk.CollectionConvertersbietet asJavaüber einen Zuhälter von Seqund 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]
Xavier Guihot
quelle
5

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]
Guillaume Massé
quelle
1

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 (_))   

Ich habe die Leistung nicht gemessen.

Stefan W.
quelle
0

Wenn Sie wie oben vorgeschlagen vorgehen, wird die Liste auch auf der Java-Seite unveränderlich. Die einzige funktionierende Lösung, die ich gefunden habe, ist folgende:

def toJList[T](l:List[T]):util.List[T] = {
  val a = new util.ArrayList[T]
  l.map(a.add(_))
  a
 }
Vitamon
quelle
0

Seit Scala 2.12.0 ist JavaConversions veraltet.

Die einfachste Lösung für mich war also:

java.util.Arrays.asList("a","b","c")
Elarib
quelle
1
Diese Antwort erklärt nicht, wie Sie damit eine Scala-Liste in eine Java-Liste konvertieren können. Arrays.asList kann auch problematisch sein, da es eine Arrays.ArrayList zurückgibt, bei der es sich nicht um eine Liste mit veränderbarer Größe handelt, die unerwartete Fehler verursachen kann, wenn Sie glauben, eine util.ArrayList zu haben.
Puhlen
1
Verachtung ist wahr, es gibt import scala.collection.JavaConverters._für 2.12.4
betet am