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

112

Como converter Scala scala.Listem Java java.util.List?

Alex Baranosky
fonte
3
cara ... mude a resposta aceita ... (por favor)
sfletche

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.

Daniel C. Sobral
fonte
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]
dimitrisli
fonte
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.

Kamil Lelonek
fonte
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]
Xavier Guihot
fonte
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)
Shirish Kumar
fonte
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]
Guillaume Massé
fonte
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.

Stefan W.
fonte
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
 }
Vitamina
fonte
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")
Elarib
fonte
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