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


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.


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]

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.


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)

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]

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]

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.


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
 }

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")

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.