【问题标题】:How to convert Java Map of Lists to Scala Map of Lists如何将 Java 列表映射转换为 Scala 列表映射
【发布时间】:2019-12-25 20:04:01
【问题描述】:

我有一个 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[String,List[String]]

想知道JavaScala 的转化率。

我尝试了this,但没有得到预期的输出

在 Scala 方面,

def convertJavaToScala(stringString: java.util.HashMap[String, java.util.List[String]]) {
    val scalaMap = stringString.asScala
    scalaMap.get("key1")
    scalaMap.get("key1").foreach(println)
  }

结果是一个逗号分隔的值字符串

【问题讨论】:

    标签: java scala


    【解决方案1】:

    方法如下:

    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))
    
    

    基本上,您必须在.asScala 之后添加.toMap / .toList,因为MapList 在Scala 中是不可变的,这与Java 不同。

    【讨论】:

    • 我做了 val scalaMapConverted: Map[String, List[String]] = scalaMap.mapValues(_.asScala.toList) 但我得到 Unit required Map[String,List[String]]
    • 我不确定你在哪个上下文中运行它,但如果这是你方法的最后一个语句,它确实是Unit,你要么需要返回scalaMap,要么不分配@987654330 @ 到变量
    【解决方案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 意味着将直接从map 调用创建immutable.Map,因此无需在map 调用之前转换为immutable.Map

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2021-02-16
      • 2013-05-30
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多