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


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.


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]

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.


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]

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)

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]

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.


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
 }

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.