Como obter a lista Scala da lista Java?

133

Eu tenho uma API Java que retorna uma lista como:

public List<?> getByXPath(String xpathExpr)

Estou usando o código scala abaixo:

val lst = node.getByXPath(xpath)

Agora, se eu tentar o açúcar da sintaxe scala, como:

lst.foreach{ node => ... }

não funciona. Eu recebo o erro:

value foreach is not a member of java.util.List[?0]

Parece que eu preciso converter Java List em Scala List. Como fazer isso no contexto acima?

ás
fonte
2
possível duplicata de Conversão coleção Java em coleção Scala
Kim Stebel
@ Kim: Não sei se é apropriado encerrar isso como uma duplicata dessa pergunta em particular - essa pergunta em particular fala sobre o Scala 2.7 e o pacote scala.collection.jcl não existe mais no Scala 2.8 e 2.9.
Ken Bloom

Respostas:

177

EDIT: Observe que isso está obsoleto desde 2.12.0. Use em JavaConvertersvez disso. (comentário de @Yaroslav)

Desde o Scala 2.8, essa conversão agora é incorporada ao idioma usando:

import scala.collection.JavaConversions._

...

lst.toList.foreach{ node =>   .... }

trabalho. asScalanão funcionou

ás
fonte
13
Em 2.10.4 eu tinha que importar scala.collection.JavaConverters._ caso contrário eu tenho "valor asScala não é membro de java.util.List [String]"
dranxo
11
JavaConversionsestão obsoletos desde 2.12.0. Use em JavaConvertersvez disso.
Yaroslav #
4
Para 2.13.x, você precisa import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou
92

Existe um objeto Scala útil apenas para isso - scala.collection.JavaConverters

Você pode fazer a importação e asScaladepois da seguinte maneira:

import scala.collection.JavaConverters._

val lst = node.getByXPath(xpath).asScala
lst.foreach{ node =>   .... }

Isso deve fornecer a Bufferrepresentação do Scala, permitindo que você realize foreach.

montreal.eric
fonte
7
O JavaConverters deve ser preferido sobre o JavaConversions, pois torna a conversão explícita (e evita conversões acidentais que podem ser confusas). (Ie, esta é a resposta correta)
Mark
desde o scala 2.13, essa classe também está obsoleta. Use scala.jdk.CollectionConverters.
Dev-null #
9

Eu estava procurando uma resposta escrita em Java e surpreendentemente não consegui encontrar nenhuma solução limpa aqui. Depois de um tempo, consegui descobrir e decidi adicioná-lo aqui, caso outra pessoa estivesse procurando a implementação Java (acho que também funciona no Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
Radix
fonte
9

Se você precisar converter um Java List<ClassA>em um Scala List[ClassB], faça o seguinte:

1) Adicionar

import scala.collection.JavaConverters._

2) Utilizar métodos asScala, toListe em seguidamap

List <ClassA> javaList = ...
var scalaList[ClassB] = javaList.asScala.toList.map(x => new ClassB(x))

3) Adicione o seguinte ao ClassBconstrutor que recebe ClassAcomo parâmetro:

case class ClassB () {
   def this (classA: ClassA) {
      this (new ClassB (classA.getAttr1, ..., classA.getAttrN))
   }
}
Leandro carrasco
fonte
6

Desde o scala 2.8.1, use JavaConverters._ para converter as coleções scala e Java usando os métodos asScala e asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

consulte o site do documento de escala de relacionamento de conversão

user1553728
fonte
6

Atalho para converter a lista java em lista scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Xing-Wei Lin
fonte