Sto usando una libreria Scala dal mio codice Java. E ho un problema con le collezioni. Devo passare scala.collection.immutable.Map
come parametro di un metodo. Posso convertire o creare immutable.Map
dal mio codice Java ma non so come farlo. Suggerimenti?Converti java.util.HashMap in scala.collection.immutable.Map in java
14
A
risposta
0
È possibile fornire una chiamata API aggiuntiva che accetta/fornisce una java.util.Map convertita utilizzando JavaConverters?
class Example {
import scala.collection.JavaConverters._
def fromMap(m:Map[...]) = ...
// generics etc. elided
def fromJava(m:java.util.Map) = {
fromMap(m.asScala.toMap)
}
}
Si potrebbe desiderare di estrarre la conversione e fornire un decoratore (soprattutto perché faccio notare che si sta lavorando a una libreria Scala). Nota commento dhg re. immutabilità.
17
'del tutto possibile utilizzare JavaConverters
in Java in codice ci sono solo un paio di cerchi aggiuntivi per saltare attraverso:
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;
}
}
Possiamo dimostrare che questo funziona dalla 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)
Ma ovviamente è possibile chiamare questi metodi con il codice Java.
0
questo ha funzionato per me con Java 1.8 e 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
La mia soluzione per Java 1.7 e Scala 2.11:
@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);
}
Problemi correlati
- 1. java.util.HashMap non implementa java.util.Map in Kotlin?
- 2. Converti JavaScript in Java
- 3. Converti TypeScript in Java
- 4. Converti byte stringa in Java
- 5. Converti ByteArray in UUID java
- 6. Java: Converti byte in intero
- 7. Converti array Java in Iterable
- 8. Java - Converti immagine in Base64
- 9. Converti file XML in CSV in java
- 10. Converti stringa in Clob in Java
- 11. Converti ByteBuffer in String in Java
- 12. Converti stringa in data in java
- 13. Converti MD5 in stringa in java
- 14. convertire java.util.Map [String, Object] in scala.collection.immutable.Map [String, Any]
- 15. significato di "potenza di 2" nell'attuazione java.util.HashMap
- 16. Converti ByteBuffer in byte array java
- 17. Converti stringa di codice in Java
- 18. Converti array MD5 in String java
- 19. Converti array JSON in normale array Java
- 20. Converti numero Java in BigDecimal: modo migliore
- 21. Converti short to byte [] in Java
- 22. Converti documento Word in PDF utilizzando Java
- 23. Converti stream in stringa Java/Groovy
- 24. Java Converti oggetto [] matrice in vettore
- 25. Java 8 - Converti LocalDate in ZonedDateTime
- 26. Converti timestamp unix alla data in java
- 27. Converti file .Java in file .Smali
- 28. Java - Converti stringa in oggetto URI valido
- 29. Converti un tiff in un'immagine bufferizzata (Java)
- 30. Converti stringa Java in Ora, NON Data
Non esiste un metodo "toMap" più. Il codice sopra non può essere compilato per Java 1.7 e Scala 2.11 :( –
jdk 1.8, mostra l'errore "impossibile accedere a scala.Predef. $ Less $ colon $ less" – Freedom