Scala中使用java.util.HashMap动态创建报错问题咨询
解决Scala动态创建Java HashMap数组的报错问题
首先,先回顾你能正常运行的静态代码——这里你明确构造了键值对形式的Scala Map,再传给Java HashMap的构造器,类型匹配完全没问题:
import java.util.HashMap val row1 = new HashMap[String,String](Map("code" -> "B1", "name" -> "Store1")) val row2 = new HashMap[String,String](Map("code" -> "B2", "name" -> "Store 2")) val map1 = Array[Object](row1,row2)
而你动态创建时出错,大概率是踩了两个常见的坑,我帮你逐个拆解并给出解决方案:
核心问题分析
你的动态代码片段里row.map(col => "someNam...")存在两个关键问题:
- 没有生成正确的键值对结构:Scala的
Map需要由(String, String)类型的元组构成,但直接对Seq[String]做map只会得到Seq[String],根本无法转换成Map - 忽略了Scala与Java集合的类型适配:Java的
HashMap构造器接收的是java.util.Map,不是Scala原生的Map,必须做显式的类型转换
针对性解决方案
根据你values: Seq[Seq[String]]的结构,分两种常见场景给出正确代码:
场景1:每个子Seq对应一组code和name(比如Seq("B1", "Store1"))
如果每个子Seq的第一个元素是code值,第二个是name值,代码可以这么写:
import java.util.HashMap import scala.jdk.CollectionConverters._ // Scala 2.13+ 用这个;旧版本用 scala.collection.JavaConverters._ val values: Seq[Seq[String]] = Seq(Seq("B1", "Store1"), Seq("B2", "Store2")) val mapx: Array[Object] = values.map { row => // 1. 构造键值对形式的Scala Map val scalaMap = Map("code" -> row(0), "name" -> row(1)) // 2. 把Scala Map转换成Java兼容的Map,再传给HashMap构造器 new HashMap[String, String](scalaMap.asJava) }.toArray[Object] // 3. 安全转换为目标类型的数组
场景2:每个子Seq是扁平化的键值对(比如Seq("code", "B1", "name", "Store1"))
如果你的子Seq是键、值交替的结构,需要先把它两两分组转换成键值对元组:
import java.util.HashMap import scala.jdk.CollectionConverters._ val values: Seq[Seq[String]] = Seq(Seq("code", "B1", "name", "Store1"), Seq("code", "B2", "name", "Store2")) val mapx: Array[Object] = values.map { row => // 1. 将子Seq两两分组,生成键值对元组 val keyValuePairs = row.grouped(2).map { case Seq(k, v) => k -> v }.toSeq // 2. 把元组序列转换成Scala Map val scalaMap = Map(keyValuePairs: _*) // 3. 转换为Java Map并创建HashMap new HashMap[String, String](scalaMap.asJava) }.toArray[Object]
额外注意点
- 如果你用的是Scala 2.12及更早版本,把
scala.jdk.CollectionConverters._换成scala.collection.JavaConverters._ - 尽量避免直接用
asInstanceOf强制类型转换,toArray[Object]是更安全的数组类型转换方式
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

