Pergunta

Como converter scala.List do Scala em java.util.List de Java?

Foi útil?

Solução

Lista Scala e Lista de Java são duas bestas diferentes, porque o primeiro é imutável e o último é mutável. Então, para ir de um para outro, você primeiro tem que converter a lista Scala em uma coleção mutável.

Em Scala 2.7:

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

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

No entanto, asList nesse exemplo não é necessário se o tipo esperado é um List Java, como a conversão está implícito, como demonstrado pela última linha.

Outras dicas

Não sei por que isso não foi mencionado antes, mas eu acho que a maneira mais intuitiva é invocar o método asJava decorador 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]

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ê quer ser explícita e dizer exatamente que você 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 quer conversões de controle de co e deixe compilador make implícita trabalho 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]

É até você como você deseja controlar o seu código.

perguntas idade consideravelmente, embora eu vou responder, dado, mas a maioria das sugestões são preteridos.

import scala.collection.JavaConversions.seqAsJavaList

val myList = List("a", "b", "c")
val myListAsJavaList = seqAsJavaList[String](myList)

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]

Iniciando Scala 2.13, o pacote scala.jdk.CollectionConverters fornece asJava através de um cafetão de Seq e substitui 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]

Para invocações individuais, fazê-lo com a mão 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 medir o desempenho.

Apenas fazendo como proposto acima produz lista imutável, mesmo no lado Java. A solução só trabalhando que eu encontrei é esta:

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

Desde Scala 2.12.0 JavaConversions tem sido obsoleta.

Assim, a solução mais simples para mim foi:

java.util.Arrays.asList("a","b","c")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top