Estoy usando alguna biblioteca Scala de mi código Java. Y tengo un problema con las colecciones. Necesito pasar scala.collection.immutable.Map
como parámetro de un método. Puedo convertir o compilar immutable.Map
desde mi código de Java, pero no sé cómo hacerlo. Sugerencias?Convierta java.util.HashMap en scala.collection.immutable.Map en java
14
A
Respuesta
0
¿Puede proporcionar una llamada de API adicional que tome/proporcione un java.util.Map convertido utilizando JavaConverters?
class Example {
import scala.collection.JavaConverters._
def fromMap(m:Map[...]) = ...
// generics etc. elided
def fromJava(m:java.util.Map) = {
fromMap(m.asScala.toMap)
}
}
Es posible que desee extraer la conversión y proporcionar un decorador (especialmente en lo que observo que está trabajando en una biblioteca de Scala). Nota dhg del comentario re. inmutabilidad.
17
Es perfectamente posible utilizar JavaConverters
en Java de código no son sólo un par de aros adicionales para saltar a través de:
import java.util.HashMap;
import scala.Predef;
import scala.Tuple2;
import scala.collection.JavaConverters;
import scala.collection.immutable.Map;
public class ToScalaExample {
public static <A, B> Map<A, B> toScalaMap(HashMap<A, B> m) {
return JavaConverters.mapAsScalaMapConverter(m).asScala().toMap(
Predef.<Tuple2<A, B>>conforms()
);
}
public static HashMap<String, String> example() {
HashMap<String, String> m = new HashMap<String, String>();
m.put("a", "A");
m.put("b", "B");
m.put("c", "C");
return m;
}
}
Podemos demostrar que esto funciona de la Scala REPL:
scala> val jm: java.util.HashMap[String, String] = ToScalaExample.example
jm: java.util.HashMap[String,String] = {b=B, c=C, a=A}
scala> val sm: Map[String, String] = ToScalaExample.toScalaMap(jm)
sm: Map[String,String] = Map(b -> B, c -> C, a -> A)
Pero, por supuesto, podría llamar fácilmente a estos métodos desde el código de Java.
0
Esto funcionó para mí con Java 1.8 y 2.12 Scala:
public static <K, V> scala.collection.immutable.Map<K, V> toScalaImmutableMap(java.util.Map<K, V> jmap) {
List<Tuple2<K, V>> tuples = jmap.entrySet()
.stream()
.map(e -> Tuple2.apply(e.getKey(), e.getValue()))
.collect(Collectors.toList());
Seq<Tuple2<K, V>> scalaSeq = JavaConverters.asScalaBuffer(tuples).toSeq();
return (Map<K, V>) Map$.MODULE$.apply(scalaSeq);
}
1
Mi solución para Java 1.7 y 2.11 Scala:
@SuppressWarnings("unchecked")
private static <K, V> scala.collection.immutable.Map<K, V> toScalaImmutableMap(java.util.Map<K, V> javaMap) {
final java.util.List<scala.Tuple2<K, V>> list = new java.util.ArrayList<>(javaMap.size());
for (final java.util.Map.Entry<K, V> entry : javaMap.entrySet()) {
list.add(scala.Tuple2.apply(entry.getKey(), entry.getValue()));
}
final scala.collection.Seq<Tuple2<K, V>> seq = scala.collection.JavaConverters.asScalaBufferConverter(list).asScala().toSeq();
return (scala.collection.immutable.Map<K, V>) scala.collection.immutable.Map$.MODULE$.apply(seq);
}
Cuestiones relacionadas
- 1. bucle infinito en java.util.HashMap
- 2. Convierta JavaScript a Java
- 3. Convierta .csv a .xls en Java
- 4. convertir java.util.Map [String, Object] en scala.collection.immutable.Map [String, Any]
- 5. Implementación interna de java.util.HashMap y HashSet
- 6. Convierta una cadena hexadecimal en un byte en Java
- 7. Convierta la aplicación Java en el salvapantallas de Windows
- 8. Convierta iCal a HTML o texto plano en Java
- 9. Convierta cualquier objeto a HTML bonito en java
- 10. Convierta caracteres UTF-16 unicode a UTF-8 en java
- 11. Convierta el diseño de photoshop en Java GUI
- 12. Java: convierta entidades html con nombre en entidades xml numeradas
- 13. Android/Java: Convierta cualquier cadena en color (hexadecimal)
- 14. Convierta una cadena de entrada de usuario en mayúscula Java
- 15. Convierta un entero en una matriz de caracteres: java
- 16. Convierta una cadena a flujo de entrada XML en java
- 17. Convierta java.util.Set en scala.collection.Set
- 18. Convierta lptstr en char *
- 19. Convierta polígonos en malla
- 20. Convierta Word Document a PDF usando Java
- 21. Java: convierta un char [] a CharSequence
- 22. Convierta una fecha en cadena en Javascript
- 23. Convierta objeto en cadena JSON
- 24. Convierta NSString en número entero
- 25. Convierta la secuencia en operador
- 26. Convierta LPWSTR en la cadena
- 27. Convierta WCHAR en QString en Qt
- 28. Java.util.HashMap: ¿por qué HashMap extiende AbstractMap e implementa Map?
- 29. Convierta el proyecto de Java en un proyecto de Android en Eclipse
- 30. Convierta el conjunto <Integer> en el conjunto <String> en Java
No existe un método "tomap" más. El código anterior no se puede compilar para Java 1.7 y Scala 2.11 :( –
jdk 1.8, muestra el error "no se puede acceder a scala.Predef. $ Less $ colon $ less" – Freedom