Mapa anidado de Java a secuencia anidada de Scala

Soy nuevo en Scala y nuestro proyecto combina código Java y Scala (usando Play Framework). Estoy tratando de escribir un método Scala que pueda tomar un Mapa Java anidado como:

LinkedHashMap<String, LinkedHashMap<String, String>> groupingA = new LinkedHashMap<String, LinkedHashMap<String,String>>();

Y haga que ese objeto Java pase a una función Scala que pueda recorrerlo. Tengo la siguiente definición de objeto scala para probar y admitir el mapa anidado Java anterior:

Seq[(String, Seq[(String,String)])]

Tanto el archivo Java como el archivo Scala se compilan bien individualmente, pero cuando mi objeto Java intenta crear una nueva instancia de mi clase scala y pasarla al mapa anidado, aparece un error del compilador con los siguientes detalles:

[error]  ..... overloaded method value apply with alternatives:
[error]   (options: java.util.List[String])scala.collection.mutable.Buffer[(String, String)] <and>
[error]   (options: scala.collection.immutable.List[String])List[(String, String)] <and>
[error]   (options: java.util.Map[String,String])Seq[(String, String)] <and>
[error]   (options: scala.collection.immutable.Map[String,String])Seq[(String, String)] <and>
[error]   (options: (String, String)*)Seq[(String, String)]
[error]  cannot be applied to (java.util.LinkedHashMap[java.lang.String,java.util.LinkedHashMap[java.lang.String,java.lang.String]])

¿Alguna idea aquí sobre cómo puedo pasar un Java LinkedHashMap anidado como el anterior a un archivo Scala donde puedo iterar genéricamente sobre una colección anidada? Estoy tratando de escribir esto lo suficientemente genérico como para que también funcione para una colección Scala anidada en caso de que alguna vez cambiemos a escribir nuestros controladores de marco de juego en Scala en lugar de Java.

Respuesta 1

Seqes un rasgo base definido en la jerarquía de Colecciones Scala. Mientras que Java y Scala ofrecen compatibilidad con el código de bytes, Scala define una serie de sus propios tipos, incluida su propia biblioteca de colección. El problema aquí es que si desea escribir scala idiomática, necesita convertir sus datos de Java en datos de scala. A mi modo de ver, tienes algunas opciones.

  • Puede usar la solución de Richard y convertir los tipos de Java a tipos de escala en su código de escala. Creo que esto es feo porque supone que su aporte siempre vendrá de Java.

  • Puede escribir un controlador de scala hermoso y perfecto y proporcionar un objeto complementario que ofrezca el comportamiento de conversión feo de Java. Esto desenreda su implementación scala de los detalles de Java.

  • O podría escribir una definición implícita como la que se muestra a continuación genéricamente al contenido de su corazón.

.

import java.util.LinkedHashMap
import scala.collection.JavaConversions.mapAsScalaMap

object App{
  implicit def wrapLhm[K,V,G](i:LinkedHashMap[K,LinkedHashMap[G,V]]):LHMWrapper[K,V,G] = new LHMWrapper[K,V,G](i)

  def main(args: Array[String]){
    println("Hello World!")
    val lhm = new LinkedHashMap[String, LinkedHashMap[String,String]]()
    val inner = new LinkedHashMap[String,String]()
    inner.put("one", "one")
    lhm.put("outer",inner);
    val s = lhm.getSeq()
    println(s.toString())
  }
  class LHMWrapper[K,V,G](value: LinkedHashMap[K,LinkedHashMap[G,V]]){
    def getSeq():Seq[ (K, Seq[(G,V)])] = mapAsScalaMap(value).mapValues(mapAsScalaMap(_).toSeq).toSeq
  }
}
Respuesta: 2

Tengo una base de código java que genera un hash codificado en base64 seguro para URL a partir de una cadena, y me pregunto si esto sería posible con las herramientas de línea de comandos de Linux. Estoy adivinando el problema con lo que yo ...

Estoy enfrentando un problema al cerrar las conexiones de la base de datos. Recibo el siguiente error ============================================ ====================================== 267137 [http-8080-Processor23] ...

ArrayList <HashMap <String, String >> menuItems = new ArrayList <HashMap <String, String >> (); Analizador XMLParser = nuevo XMLParser (); Cadena xml = parser.getXmlFromUrl (url); // consiguiendo ...

Tengo curiosidad sobre cuál es la mejor manera de hacer una reescritura de URL, en una aplicación Java. Digamos que tiene una aplicación llamada test_app, y la implemento en tomcat. Por reescritura de URL quiero decir que en lugar de acceder a la aplicación ...