我有一个列表的Java Map
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"));
我要将其转换为Scala列表列表
Map[String,List[String]]
想知道Java和Scala上的转换。
我已经尝试过了,但是没有得到预期的输出 https://stackoverflow.com/a/11903737/4550466
在Scala方面,
def convertJavaToScala(stringString: java.util.HashMap[String, java.util.List[String]]) {
val scalaMap = stringString.asScala
scalaMap.get("key1")
scalaMap.get("key1").foreach(println)
}
但是结果是逗号分隔的值字符串。
答案 0 :(得分:4)
这是这样做的方法:
import 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(_.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)
// Displays
// Map(key1 -> List(k1v1, k1v2), key2 -> List(k2v1, k2v2), key3 -> List(k3v1, k3v2))
基本上,您必须在.toMap
之后添加.toList
/ .asScala
,因为Map
和List
在Scala中是不可变的,与Java不同。
答案 1 :(得分:2)
这是进行转换的有效方法:
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
意味着将直接从immutable.Map
调用中创建一个map
,因此在调用immutable.Map
之前无需转换为map
。>