我从我的Java代码中使用了一些Scala库。我有一个收藏问题。我需要通过scala.collection.immutable.Map
作为方法的参数。我可以从我的Java代码转换或构建immutable.Map
,但我不知道该怎么做。建议?将java.util.HashMap转换为java中的scala.collection.immutable.Map
14
A
回答
0
你能提供一个额外的API调用,它需要/提供一个使用JavaConverters转换的java.util.Map吗?
class Example {
import scala.collection.JavaConverters._
def fromMap(m:Map[...]) = ...
// generics etc. elided
def fromJava(m:java.util.Map) = {
fromMap(m.asScala.toMap)
}
}
你可能希望提取转换并提供一个装饰器(尤其是当我注意到你正在使用Scala库)。注意dhg的评论re。不变性。
17
这是完全有可能在Java中使用JavaConverters
代码刚好有一对夫妇的额外跳火圈通过:
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;
}
}
我们可以证明,这个来自斯卡拉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)
但是,当然你可以简单地从Java代码中调用这些方法。
0
这为我工作与Java 1.8和Scala 2.12:
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
我对Java 1.7和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);
}
相关问题
- 1. 将java.util.Map [String,Object]转换为scala.collection.immutable.Map [String,Any]
- 2. 的Android的java.util.HashMap不能转换为java.lang.String
- 3. 的java.util.HashMap无法强制转换为org.apache.axiom.om.OMElement
- 4. java.lang.String不能转换为java.util.HashMap错误
- 5. 如何将List <scala.Tuple2>转换为java.util.HashMap?
- 6. java.util.hashmap $ values无法转换为android putExtra方法中的java.io.serializable
- 7. 从Firebase中读取时“无法将类型java.util.HashMap的值转换为字符串”
- 8. 将Excel xlsx转换为Java中的xls
- 9. 将PDF转换为Java中的Word
- 10. 将DataModel转换为Java中的列表
- 11. 将JSON转换为Java中的XML
- 12. 将JDom Document转换为Java中的SOAPMessage
- 13. 将点转换为JAVA中的dotx
- 14. 将JSON转换为Java中的XLS/CSV
- 15. 将Java中的一行转换为c#
- 16. 将html转换为java中的doc
- 17. java将int转换为short
- 18. 将Jython转换为Java
- 19. 将NSData转换为Java float?
- 20. 将DLL转换为Java
- 21. 将Java Date转换为Php
- 22. 将JavaScript转换为Java
- 23. 将asc转换为java
- 24. 将cURL转换为Java
- 25. 将javascript转换为java
- 26. 将Java类转换为DLL
- 27. 将matlab转换为java
- 28. Java将GzipInputStream转换为DataInputStream
- 29. 将Java转换为Lua
- 30. Java:将char []转换为CharSequence
没有 “toMap” 的方法了。上面的代码不能编译为Java 1.7和Scala 2.11 :( – 2016-01-16 15:28:09
jdk 1.8,它显示“无法访问scala.Predef。$ less $ colon $ less”错误 – Freedom 2016-10-10 10:31:49