我有以下数据结构:
java.util.Map [List [String],List [String]] = {[10,20] = [1500],[5,7] = [1400]}
我正在尝试使用Scala提取数字10 20 5 and 7
。我希望实现这一目标的方式是:
map.head._1 -> to extract 10 (map.head returns a tuple)
map.head._2 -> to extract 20 (map.head returns a tuple)
但是,我收到以下异常:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to scala.collection.immutable.List
我已阅读有关导入import scala.collection.JavaConversions._
但是,这并没有解决任何问题。
谢谢,非常感谢任何帮助!
试图实现此目的的代码是:
def getTokenRangeForKeys(params: String): java.util.Map[List[String], List[String]] = {
invokeOperation[java.util.Map[List[String], List[String]]]("XXX", "YYY", Array(params))
}
上面的方法返回我的地图,如下所示:
map = java.util.Map[List[String],List[String]] = {[10, 20]=[1500], [5, 7]=[1400]}
到目前为止我尝试过:
map.head._1 -> java.lang.ClassCastException: java.util.ArrayList cannot be cast to scala.collection.immutable.List
scalaMap = map.asScala
m.headOption match {
case Some((h1, h2)) => println((h1, h2)) -> java.util.ArrayList cannot be cast to scala.collection.immutable.List
case None => ...
}
答案 0 :(得分:0)
请勿使用JavaConversions
。
import scala.collection.JavaConverters._
val m = map.asScala.map({case (h, k) => (h.asScala, k.asScala)})
m.headOption match {
case Some((h1, h2)) => ...
case None => ...
}
答案 1 :(得分:0)
我认为您对来自Java世界的内容的声明应该是:
java.util.Map[java.util.List[String], java.util.List[String]]
在java.util.Map[List[String], List[String]]
的当前形式中,您声明了Scala列表的Java地图,这可能不是您想要的。传递Java类型时JVM没有抱怨,因为只检查顶级类型作为函数签名检查的一部分 - 这称为类型擦除。
在此,您应该使用JavaConverters
asScala
转换为Reactormonk答案中所写的相应Scala类型:
import scala.collection.JavaConverters._
val m = map.asScala.map({case (h, k) => (h.asScala, k.asScala)})