如何在需要 scala Map[String, Any] 的地方使用 java Map<String, Object>?
How to use java Map<String, Object> where scala Map[String, Any] is requred?
如何use/convert映射到scala Map[String, Any]?
Java 对象在 Scala 中被识别为 AnyRef。
有没有单行转换的?我想避免迭代新创建的 scala Map 和复制 refs。
提前致谢。
可能是这样的:
val jmap = new HashMap[String, Object]
jmap.put("1", new Date)
import scala.collection.JavaConverters._
val smap = jmap.asScala.mapValues(_.asInstanceOf[Any]).toMap
test(smap)
def test(m: Map[String, Any]): Unit = {
println(m)
}
还要注意 java.lang.Object
等同于 Scala 中的 AnyRef
,而不是 Any
。
这应该有效:
import scala.collection.JavaConversions._
val javaMap = new HashMap[String,Object]
val scalaMap: Map[String,Any] = javaMap.toMap
或者,如果您不喜欢 "the magic of implicits",请执行以下操作:
import scala.collection.JavaConverters._ // note, this is a different import
val javaMap = new HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala.toMap // this .asScala is what the other version does implicitly
另请注意,最后的 toMap
是必需的,因为 javaMap.asScala
returns 一个 mutable.Map
,并且 Map[String,Any]
声明默认为 immutable.Map
默认。
如果您改用 scala.collection.Map
,则不需要它:
import scala.collection.Map
import scala.collection.JavaConversions._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String,Any] = javaMap // voila!
或明确地
import scala.collection.Map
import scala.collection.JavaConverters._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala
如何use/convert映射到scala Map[String, Any]?
Java 对象在 Scala 中被识别为 AnyRef。
有没有单行转换的?我想避免迭代新创建的 scala Map 和复制 refs。
提前致谢。
可能是这样的:
val jmap = new HashMap[String, Object]
jmap.put("1", new Date)
import scala.collection.JavaConverters._
val smap = jmap.asScala.mapValues(_.asInstanceOf[Any]).toMap
test(smap)
def test(m: Map[String, Any]): Unit = {
println(m)
}
还要注意 java.lang.Object
等同于 Scala 中的 AnyRef
,而不是 Any
。
这应该有效:
import scala.collection.JavaConversions._
val javaMap = new HashMap[String,Object]
val scalaMap: Map[String,Any] = javaMap.toMap
或者,如果您不喜欢 "the magic of implicits",请执行以下操作:
import scala.collection.JavaConverters._ // note, this is a different import
val javaMap = new HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala.toMap // this .asScala is what the other version does implicitly
另请注意,最后的 toMap
是必需的,因为 javaMap.asScala
returns 一个 mutable.Map
,并且 Map[String,Any]
声明默认为 immutable.Map
默认。
如果您改用 scala.collection.Map
,则不需要它:
import scala.collection.Map
import scala.collection.JavaConversions._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String,Any] = javaMap // voila!
或明确地
import scala.collection.Map
import scala.collection.JavaConverters._
val javaMap = HashMap[String, Object]
val scalaMap: Map[String, Any] = javaMap.asScala