如何将Java列表映射转换为Scala列表映射
我有一张列表的Java地图如何将Java列表映射转换为Scala列表映射,java,scala,Java,Scala,我有一张列表的Java地图 Map<String, List<String>> stringToListOfStrings = new HashMap<String, List<String>>(); stringToListOfStrings.put("key1", Arrays.asList("k1v1", "k1v2")); stringToListOfStrings.put("key2", Arrays.as
Map<String, List<String>> stringToListOfStrings = new HashMap<String, List<String>>();
stringToListOfStrings.put("key1", Arrays.asList("k1v1", "k1v2"));
stringToListOfStrings.put("key2", Arrays.asList("k2v1", "k2v2"));
stringToListOfStrings.put("key3", Arrays.asList("k3v1", "k3v2"));
想知道Java
和Scala
中的转换
我已经试过了,但没有得到预期的结果
在Scala方面
def convertJavaToScala(stringString: java.util.HashMap[String, java.util.List[String]]) {
val scalaMap = stringString.asScala
scalaMap.get("key1")
scalaMap.get("key1").foreach(println)
}
但是,结果是一个逗号分隔的值字符串以下是实现此操作的方法:
导入scala.collection.JavaConverters_
def convertJavaToScala(stringString:java.util.HashMap[String,java.util.List[String]]):Map[String,List[String]={
val scalaMap:Map[String,java.util.List[String]=stringString.asScala.toMap
scalaMap.mapValues(u.asScala.toList)
}
当你跑步时:
import java.util.Arrays
val stringToListOfStrings=new java.util.HashMap[String,java.util.List[String]]()
stringToListOfStrings.put(“key1”,Arrays.asList(“k1v1”,“k1v2”))
stringToListOfStrings.put(“key2”,Arrays.asList(“k2v1”,“k2v2”))
stringToListOfStrings.put(“key3”,Arrays.asList(“k3v1”,“k3v2”))
convertJavaToScala(stringToListOfStrings)
//显示
//映射(键1->List(k1v1,k1v2),键2->List(k2v1,k2v2),键3->List(k3v1,k3v2))
基本上,您必须在
.asScala
之后添加.toMap
.toList,因为Map
和List
在Scala中是不可变的,与Java不同。这是一种有效的转换方法:
def convertJavaToScala(ss: java.util.HashMap[String, java.util.List[String]]): Map[String, List[String]] =
ss.asScala.map{ case (k, v) => k -> v.asScala.toList }(collection.breakOut)
使用
map
而不是mapValues
可以避免在访问map
的元素时重复计算转换代码。使用collection.breakOut
意味着将直接从Map
调用创建immutable.Map
,因此无需在Map
调用之前转换为immutable.Map
。I did val scalaMapConverted:Map[String,List[String]=scalaMap.mapValues(u.asScala.toList)但是我正在获取单位所需的映射[String,List[String]]我不确定您在哪个上下文中运行这个,但是如果这是您方法的最后一个语句,它确实是Unit
,您需要返回scalaMap
,或者不将scalaMap.mapValues(u.asScala.toList)
分配给变量
def convertJavaToScala(ss: java.util.HashMap[String, java.util.List[String]]): Map[String, List[String]] =
ss.asScala.map{ case (k, v) => k -> v.asScala.toList }(collection.breakOut)