Como converter um scala.List a um java.util.List?
-
19-09-2019 - |
Pergunta
Como converter scala.List
do Scala em java.util.List
de Java?
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 ??strong> 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 ??strong> 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")