¿Cómo convertir un scala.List en un java.util.List?

112

¿Cómo convertir Scala scala.Listen Java java.util.List?

Alex Baranosky
fuente
3
amigo ... cambie la respuesta aceptada ... (por favor)
sfletche

Respuestas:

69

Scala List y Java List son dos bestias diferentes, porque el primero es inmutable y el segundo es mutable. Entonces, para pasar de uno a otro, primero debe convertir la Scala List en una colección mutable.

En Scala 2.7:

import scala.collection.jcl.Conversions.unconvertList
import scala.collection.jcl.ArrayList
unconvertList(new ArrayList ++ List(1,2,3))

Desde Scala 2.8 en adelante:

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): _*)

Sin embargo, asListen ese ejemplo no es necesario si el tipo esperado es un Java List, ya que la conversión es implícita, como lo demuestra la última línea.

Daniel C. Sobral
fuente
El val x: java.util.List [Int] sigue siendo inmutable. Solo intente en Java para x.add (algo) - arrojará un error
Vitamon
1
@Vitamon No me arroja ningún error, solo lo probé para confirmar.
Daniel C. Sobral
4
Desaprobado en favor de scala.collection.JavaConvertersdesde las 2.12 en adelante
Jeroen Kransen
para 2.12.1, al iterar inmediatamente sobre la Lista de Java con un bucle de Scala, he tenido mejor suerte con asScalaBuffer () en el paquete JavaConverters
Sarah Messer
165

No estoy seguro de por qué no se ha mencionado esto antes, pero creo que la forma más intuitiva es invocar el asJavamétodo decorador de JavaConverters directamente en la lista de Scala:

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
fuente
6
También requiere que seas explícito en lugar de depender de alguna magia implícita que podría no ser deseada en algún momento.
Kamil Lelonek
Esto causa problemas si serializa la lista para su uso posterior en código Java ... da como resultado ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) funciona en este caso.
Mohan
Vengo a esta página cada vez que necesito usar Java en Scala. Desafortunadamente, no hay forma de que la idea me sugiera una sugerencia de importación adecuada para ".asJava" ((
mulya
24

Para resumir las respuestas anteriores

Suponiendo que tengamos lo siguiente List:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

Si quiere ser explícito y decir exactamente lo que quiere convertir:

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> scalaList.asJava
res11: java.util.List[Int] = [1, 2, 3]

Si no desea controlar las conversiones y dejar que el compilador haga un trabajo implícito por usted:

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]

Depende de usted cómo desea controlar su código.

Kamil Lelonek
fuente
8

A partir Scala 2.13, el paquete scala.jdk.CollectionConvertersproporciona a asJavatravés de un proxeneta Seqy reemplaza paquetes 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
fuente
7

Preguntas bastante antiguas, aunque las responderé, pero la mayoría de las sugerencias están en desuso.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)
Shirish Kumar
fuente
object JavaConversions in package collection is deprecated (since 2.12.0): use JavaConverters
prayagupd
5

Actualizar

con scala 2.9.2:

import scala.collection.JavaConversions._
import scala.collection.mutable.ListBuffer
val x: java.util.List[Int] = ListBuffer( List( 1, 2, 3 ): _* )

resultado

[1, 2, 3]
Guillaume Massé
fuente
1

Para invocaciones únicas, hacerlo a mano podría ser la solución más simple:

val slist = List (1, 2, 3, 4)          
val jl = new java.util.ArrayList [Integer] (slist.size)
slist.foreach (jl.add (_))   

No medí el rendimiento.

Stefan W.
fuente
0

Simplemente haciendo lo propuesto anteriormente produce una lista inmutable incluso en el lado de Java. La única solución de trabajo que he encontrado es esta:

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

Desde Scala 2.12.0 JavaConversions ha quedado obsoleto.

Entonces, la solución más simple para mí fue:

java.util.Arrays.asList("a","b","c")
elarib
fuente
1
Esta respuesta no explica cómo usar esto para convertir una lista scala en una lista java. Arrays.asList también puede ser problemático ya que devuelve un Arrays.ArrayList que no es una Lista de tamaño variable que puede causar algunos errores inesperados si cree que tiene un util.ArrayList.
puhlen
1
La desaprobación es verdadera, hay import scala.collection.JavaConverters._para 2.12.4
prayagupd