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.