Como converter um scala.List em java.util.List?


Respostas:


69

Scala List e Java List são duas feras diferentes, porque a primeira é imutável e a última é mutável. Portanto, para ir de um para o outro, primeiro você deve converter a Lista Scala em uma coleção mutável.

No Scala 2.7:

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

Do Scala 2.8 em diante:

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

Porém, asListnesse exemplo não é necessário se o tipo esperado for um Java List, pois a conversão é implícita, conforme demonstrado na última linha.


O val x: java.util.List [Int] ainda é imutável. Apenas tente em Java x.add (algo) - ele gerará um erro
Vitamon

1
@Vitamon Não dá nenhum erro para mim - eu apenas testei para confirmar.
Daniel C. Sobral

4
Suspenso em favor de scala.collection.JavaConverters2.12 em diante
Jeroen Kransen

para 2.12.1, ao iterar imediatamente sobre a Lista Java com um Scala for loop, tive mais sorte com asScalaBuffer () no pacote JavaConverters
Sarah Messer

165

Não sei por que isso não foi mencionado antes, mas acho que a maneira mais intuitiva é invocar o asJavamétodo decorator de JavaConverters diretamente na lista 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
Também requer que você seja explícito, em vez de depender de alguma magia implícita que pode ser indesejada em algum momento.
Kamil Lelonek

Isso causa problemas se serializar a lista para uso subsequente no código Java ... resulta em ClassNotFoundException: scala.collection.convert.Wrappers. Arrays.asList (foo: _ *) funciona neste caso.
Mohan

Venho a esta página sempre que preciso usar Java no Scala. Infelizmente, não há nenhuma maneira de me sugerir uma sugestão de importação adequada para ".asJava" ((
mulya

24

Para resumir as respostas anteriores

Supondo que temos o seguinte List:

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

Se você quiser ser explícito e dizer exatamente o que deseja converter:

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

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

Se você não quiser conversões de co-controle e deixe o compilador fazer o trabalho implícito para você:

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 você como deseja controlar seu código.


8

A partir de Scala 2.13, o pacote scala.jdk.CollectionConvertersfornece asJavapor meio de um cafetão Seqe substitui os pacotes 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

Perguntas muito antigas, embora eu vá responder, mas a maioria das sugestões estão obsoletas.

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

Atualizar

com 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 invocações únicas, fazê-lo manualmente pode ser a solução mais simples:

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

Eu não medi o desempenho.


0

Apenas fazer como proposto acima produz uma lista imutável, mesmo no lado Java. A única solução funcional que encontrei é 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 se tornou obsoleto.

Portanto, a solução mais simples para mim era:

java.util.Arrays.asList("a","b","c")

1
Esta resposta não explica como usar isso para converter uma lista de scala em uma lista de java. Arrays.asList também pode ser problemático, pois retorna um Arrays.ArrayList, que não é uma Lista redimensionável, o que pode causar alguns erros inesperados se você achar que tem um util.ArrayList.
puhlen 01 de

1
A suspensão de uso é verdadeira, existe import scala.collection.JavaConverters._para 2.12.4
prayagupd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.