[英]How to convert Java Map of Lists to Scala Map of Lists
我有一個列表的 Java 地圖,
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
Map[String,List[String]]
想知道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)
}
但結果是一個逗號分隔的值字符串。
這是這樣做的方法:
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
是不可改變的斯卡拉,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
意味着immutable.Map
將直接從map
調用創建,因此無需在map
調用之前轉換為immutable.Map
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.