¿Cómo obtener Scala List de Java List?

133

Tengo una API Java que devuelve una lista como:

public List<?> getByXPath(String xpathExpr)

Estoy usando el siguiente código scala:

val lst = node.getByXPath(xpath)

Ahora si pruebo el azúcar de sintaxis scala como:

lst.foreach{ node => ... }

No funciona. Me sale el error:

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

Parece que necesito convertir Java List a Scala List. ¿Cómo hacer eso en el contexto anterior?

as
fuente
2
posible duplicado de Convertir la colección Java en colección Scala
Kim Stebel
@ Kim: No estoy seguro de que sea apropiado cerrar esto como un duplicado de esa pregunta en particular: esa pregunta en particular habla sobre Scala 2.7, y el paquete scala.collection.jcl ya no existe en Scala 2.8 y 2.9.
Ken Bloom

Respuestas:

177

EDITAR: Tenga en cuenta que esto está en desuso desde 2.12.0. Usar en su JavaConverterslugar. (comentario de @Yaroslav)

Desde Scala 2.8, esta conversión ahora está integrada en el lenguaje usando:

import scala.collection.JavaConversions._

...

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

trabajos. asScalano funcionó

as
fuente
13
En 2.10.4 tuve que importar scala.collection.JavaConverters._ de lo contrario obtuve "valor porque Escala no es miembro de java.util.List [String]"
dranxo
11
JavaConversionsestán en desuso desde 2.12.0. Usar en su JavaConverterslugar.
Yaroslav
44
Para 2.13.x, necesita import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html
Nikolaos Georgiou
92

Hay un práctico objeto Scala solo para esto: scala.collection.JavaConverters

Puede hacer la importación y asScalaluego de la siguiente manera:

import scala.collection.JavaConverters._

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

Esto debería darle la Bufferrepresentación de Scala que le permite lograr foreach.

montreal.eric
fuente
77
Los JavaConverters deberían preferirse a JavaConversions ya que hace que la conversión sea explícita (y evita conversiones accidentales que pueden ser confusas). (Es decir, esta es la respuesta correcta)
Mark
desde scala 2.13 esta clase también está en desuso. Utilice scala.jdk.CollectionConverters en su lugar.
dev-null
9

Estaba buscando una respuesta escrita en Java y sorprendentemente no pude encontrar ninguna solución limpia aquí. Después de un tiempo pude resolverlo, así que decidí agregarlo aquí en caso de que alguien más esté buscando la implementación de Java (¿supongo que también funciona en Scala?):

JavaConversions.asScalaBuffer(myJavaList).toList()
Base
fuente
9

Si tiene que convertir un Java List<ClassA>a un Scala List[ClassB], debe hacer lo siguiente:

1) Agregar

import scala.collection.JavaConverters._

2) Use métodos asScala, toListy luegomap

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

3) Agregue lo siguiente al ClassBconstructor que recibe ClassAcomo parámetro:

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

Desde scala 2.8.1 se usa JavaConverters._ para convertir colecciones de scala y Java usando los métodos asScala y asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

ver el sitio de Scala doc de relación de conversión

usuario1553728
fuente
6

Atajo para convertir la lista de Java a la lista de Scala

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Xing-Wei Lin
fuente