【问题标题】:How to convert java Map to scala Map of type LinkedHashMap[String,ArrayList[String]]?java - 如何将Java Map转换为LinkedHashMap [String,ArrayList [String]]类型的scala Map?
【发布时间】:2011-07-04 15:27:12
【问题描述】:

从 Java API 我得到 ​​p>

java.util.LinkedHashMap[String,java.util.ArrayList[String]]

然后我需要将其作为参数传递给 scala 程序

val rmap = Foo.baz(parameter)

这个参数是scala类型的:

Map[String,List[String]]

那么我怎样才能轻松转换

java.util.LinkedHashMap[String,java.util.ArrayList[String]]

Map[String,List[String]]

我尝试使用 import scala.collection.JavaConversions._ 但在我的情况下这不起作用(或者至少我猜是这样)因为 scala 代码在模板函数中,我只能放置 import scala.collection.JavaConversions ._ 函数内部。 模板函数如下:

def someFunc(param: java.util.LinkedHashMap[String,java.util.ArrayList[String]]) = {
import scala.collection.JavaConversions._
val rmap = Foo.baz(param) // param is of scala type Map[String,List[String]]
.......

现在 scala 不会自动将 java 类型转换为 scala 类型。

这是我得到的编译器错误: 引发的错误是:类型不匹配;找到:java.util.LinkedHashMap[String,java.util.ArrayList[String]] 需要:Map[String,List[String]]

【问题讨论】:

    标签: scala


    【解决方案1】:

    你有两个问题:scala 中的 Map 和 List 与 java 版本不同。

    scala.collection.JavaConversions.mapAsScalaMap 创建一个可变映射,因此使用可变映射,以下工作:

    import scala.collection.JavaConversions._
    import scala.collection.mutable.Map
    
    val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
    var g: Map[String, java.util.ArrayList[String]] = f
    

    ArrayList 有点难。以下作品:

    import scala.collection.JavaConversions._
    import scala.collection.mutable.Buffer
    
    val a = new java.util.ArrayList[String]
    var b: Buffer[String] = a
    

    但如果我们尝试

    import scala.collection.JavaConversions._
    import scala.collection.mutable.Map
    import scala.collection.mutable.Buffer
    
    val f = new java.util.LinkedHashMap[String, java.util.ArrayList[String]]
    var g: Map[String, Buffer[String]] = f
    

    这不起作用。您最好的选择是为此自己定义一个显式的隐式转换。

    【讨论】:

    • “显式隐式转换”。
    【解决方案2】:

    只需导入scala.collection.JavaConversions,您就应该设置好了 :) 它执行从 Scala 集合到 Java 集合的转换,反之亦然。

    如果不顺利,试试:

    val m: Map[String,List[String]] = javaMap
    

    您可能还需要转换地图中的每个列表:

    m.map {
      l => val sl: List[String] = l
      sl
    }
    

    【讨论】:

    • 不正确;你需要import collection.JavaConversions._
    • 确实如此。 import scala.collection.JavaConversions._ 比所有集合都隐式转换。
    【解决方案3】:
    scala.collection.JavaConversions.mapAsScalaMap
    

    或 JavaConversions 对象中的类似内容

    【讨论】:

      【解决方案4】:

      你可以试试

      val rmap = Foo.baz(parameter.asScala.toMap.mapValues(v => v.asScala.toList))
      

      在您的代码中导入以下内容 -

      import scala.collection.JavaConversions._
      import scala.collection.JavaConverters._
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-21
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2020-03-17
        • 1970-01-01
        • 2013-06-16
        相关资源
        最近更新 更多