Convertendo uma coleção Java em uma coleção Scala
-
21-08-2019 - |
Pergunta
relacionadas à pergunta Stack Overflow Scala equivalente de novo HashSet (Collection) , como faço para converter um Java coleção (java.util.List
digamos) em uma coleção List
Scala?
Na verdade, estou tentando converter uma chamada API Java para SimpleJdbcTemplate
do Spring, que retorna um java.util.List<T>
, em um HashSet
imutável Scala. Assim, por exemplo:
val l: java.util.List[String] = javaApi.query( ... )
val s: HashSet[String] = //make a set from l
Isso parece funcionar. A crítica é bem-vindo!
import scala.collection.immutable.Set
import scala.collection.jcl.Buffer
val s: scala.collection.Set[String] =
Set(Buffer(javaApi.query( ... ) ) : _ *)
Solução
As suas últimas obras de sugestão, mas você também pode evitar o uso jcl.Buffer
:
Set(javaApi.query(...).toArray: _*)
Note que scala.collection.immutable.Set
é feito disponível por padrão, graças a Predef.scala
.
Outras dicas
Para referência futura: Com Scala 2.8, isso poderia ser feito assim:
import scala.collection.JavaConversions._
val list = new java.util.ArrayList[String]()
list.add("test")
val set = list.toSet
set
é um scala.collection.immutable.Set[String]
depois disso.
Veja também Ben James' resposta para uma mais maneira explícita (usando JavaConverters), que parece ser recomendada agora.
Se você quiser ser mais explícito do que os JavaConversions demonstrados em robinst de resposta , você pode usar JavaConverters:
import scala.collection.JavaConverters._
val l = new java.util.ArrayList[java.lang.String]
val s = l.asScala.toSet
JavaConversions ( de robinst resposta ) e JavaConverters (resposta de Ben James ) foram reprovados com Scala 2.10 .
Em vez de JavaConversions uso:
import scala.collection.convert.wrapAll._
Em vez de JavaConverters uso:
import scala.collection.convert.decorateAll._
Para tanto, há também a possibilidade de importar apenas as conversões / conversores para Java ou Scala, respectivamente, por exemplo:.
import scala.collection.convert.wrapAsScala._
Update: A declaração acima que JavaConversions e JavaConverters foram obsoleto parece estar errado. Havia algumas propriedades Reprovados no Scala 2.10, que resultaram em advertências deprecation ao importá-los. Assim, as importações alternativo aqui parecem ser apenas aliases. Embora eu ainda preferem eles, como IMHO os nomes são os mais adequados.
Você também pode querer explorar este excelente biblioteca: scalaj-collection que tem dois sentidos conversão entre coleções Java e Scala. No seu caso, para converter um java.util.List a Lista Scala você pode fazer isso:
val list = new java.util.ArrayList[java.lang.String]
list.add("A")
list.add("B")
list.asScala
val array = java.util.Arrays.asList("one","two","three").toArray
val list = array.toList.map(_.asInstanceOf[String])
Você pode adicionar as informações de tipo na chamada toArray para formar o conjunto ser parametrizado:
val s = Set(javaApi.query(....).toArray(new Array[String](0)) : _*)
Isso pode ser preferível que o pacote coleções está passando por um grande retrabalho para Scala 2.8 eo pacote scala.collection.jcl é indo embora
Outra forma simples de resolver este problema:
import collection.convert.wrapAll._
Você poderia converter a coleção Java para uma matriz e, em seguida, criar uma lista Scala de que:
val array = java.util.Arrays.asList("one","two","three").toArray
val list = List.fromArray(array)
Iniciando Scala 2.13
, pacote scala.jdk.CollectionConverters
pacotes Substitui scala.collection.JavaConverters/JavaConversions._
:
import scala.jdk.CollectionConverters._
// val javaList: java.util.List[String] = java.util.Arrays.asList("one","two","three")
javaList.asScala
// collection.mutable.Buffer[String] = Buffer("one", "two", "three")
javaList.asScala.toSet
// collection.immutable.Set[String] = Set("one", "two", "three")