¿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?



@ 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ó


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.


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()

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))
   }
}

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


6

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

import scala.collection.JavaConverters._

myjavaList.asScala.toList

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.