¿Cómo obtener la lista Scala de la lista Java?

3 minutos de lectura

avatar de usuario
as

Tengo una API de 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 de 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?

  • posible duplicado de Convertir la colección Java en la colección Scala

    – Kim Stebel

    15 de junio de 2011 a las 11:00

  • @Kim: No estoy seguro de que sea apropiado cerrar esto como un duplicado de esa pregunta en particular; esa pregunta en particular habla de Scala 2.7, y el paquete scala.collection.jcl ya no existe en Scala 2.8 y 2.9.

    –Ken Bloom

    15 de junio de 2011 a las 15:08


avatar de usuario
as

EDITAR: tenga en cuenta que esto está en desuso desde 2.12.0. Usar JavaConverters en cambio. (comentario de @Yaroslav)

Ya que escala 2.8 esta conversión ahora está integrada en el lenguaje usando:

import scala.collection.JavaConversions._

...

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

obras. asScala no funcionó

En uso 2.12.x import scala.collection.JavaConverters._

En 2.13.x uso import scala.jdk.CollectionConverters._

  • En 2.10.4 tuve que importar scala.collection.JavaConverters._ de lo contrario obtuve “valor como Scala no es miembro de java.util.List[String]”

    – dranxo

    23 mayo 2014 a las 23:27

  • JavaConversions están en desuso desde 2.12.0. Usar JavaConverters en cambio.

    – Yaroslav

    5 de abril de 2017 a las 10:47

  • Para 2.13.x, necesita import scala.jdk.CollectionConverters._ scala-lang.org/api/2.13.x/scala/jdk/CollectionConverters$.html

    – Nikolaos Georgiou

    21 de septiembre de 2019 a las 4:00

avatar de usuario
montreal.eric

Hay un objeto Scala útil solo para esto: scala.collection.JavaConverters

Puedes hacer la importación y asScala después de la siguiente manera:

import scala.collection.JavaConverters._

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

Esto debería darte Scala Buffer representación que le permite lograr foreach.

  • Se debe preferir JavaConverters 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)

    – Marca

    18/09/2014 a las 17:34

  • desde Scala 2.13, esta clase también está en desuso. Utilice scala.jdk.CollectionConverters en su lugar.

    – stackunderflow

    17 oct 2019 a las 19:41

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

avatar de usuario
leandro carrasco

Si tiene que convertir un Java List<ClassA> a una escala List[ClassB]entonces debes hacer lo siguiente:

1) Agregar

import scala.collection.JavaConverters._

2) Usar métodos asScala, toList y entonces map

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

3) Agregue lo siguiente a la ClassB constructor que recibe ClassA como parámetro:

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

avatar de usuario
Xing Wei Lin

Acceso directo para convertir la lista de java a la lista de scala

import scala.jdk.CollectionConverters._

myjavaList.asScala.toList

  • scala.collection.JavaConverters._ es obsoleto. Usar: scala.jdk.CollectionConverters._

    –Branislav Lazic

    9 de noviembre de 2021 a las 12:25

avatar de usuario
piro

Desde el uso de Scala 2.8.1 JavaConverters._
para convertir colecciones de Scala y Java utilizando los métodos asScala y asJava.

import scala.collection.JavaConverters._

javalist.asScala

scalaSeq.asJava

ver la relación de conversión sitio scala doc

  • scala.collection.JavaConverters._ es obsoleto. Usar: scala.jdk.CollectionConverters._

    –Branislav Lazic

    9 de noviembre de 2021 a las 12:25

¿Ha sido útil esta solución?