wake-up-neo.com

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

Wie konvertiert man Scala's scala.List in Javas Java.util.List?

103
Alex Baranosky

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.

66

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]
151
dimitrisli

Um die vorherigen Antworten zusammenzufassen

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.

22
Kamil Lelonek

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)
6
Shirish Kumar

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]
5

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]
4
Xavier Guihot

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.

1
Stefan W.

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
 }
0
Vitamon