在scala中使用java映射
我完全被Scala REPL中的这种行为弄糊涂了:在scala中使用java映射,scala,Scala,我完全被Scala REPL中的这种行为弄糊涂了: scala> import java.util.Map import java.util.Map scala> import java.util.HashMap import java.util.HashMap scala> val jMap:java.util.Map[String,Int]=new HashMap[String,Int]("first"->1,"second" -> 2) <cons
scala> import java.util.Map
import java.util.Map
scala> import java.util.HashMap
import java.util.HashMap
scala> val jMap:java.util.Map[String,Int]=new HashMap[String,Int]("first"->1,"second" -> 2)
<console>:12: error: type mismatch;
found : (String, Int)
required: Float
val jMap =new HashMap[String,Int]("first"->1,"second" -> 2)
^
<console>:12: error: type mismatch;
found : (String, Int)
required: Float
val jMap=new HashMap[String,Int]("first"->1,"second" -> 2)
^
scala>import java.util.Map
导入java.util.Map
scala>导入java.util.HashMap
导入java.util.HashMap
scala>val jMap:java.util.Map[String,Int]=newhashmap[String,Int](“第一个”->1,“第二个”->2)
:12:错误:类型不匹配;
找到:(字符串,Int)
必需:浮动
val jMap=newhashmap[String,Int](“第一个”->1,“第二个”->2)
^
:12:错误:类型不匹配;
找到:(字符串,Int)
必需:浮动
val jMap=newhashmap[String,Int](“第一个”->1,“第二个”->2)
^
有人能解释一下这里发生了什么吗?
java.util.HashMap
不提供通过传递(K,V)
的vararg来构造映射的功能,但是有一个双参数构造函数接受initialCapacity:Int
和loadFactor:Float
,这就是为什么需要浮点时会出现编译错误
(针对scala 2.13+更新)scala中的惯用方法是只使用scala不可变映射(无需导入):
如果您的Scala代码使用返回Java.util.Map
的Java库,则可以使用Scala.jdk.CollectionConverters
将其显式转换为Scala映射,如下所示:
import scala.jdk.CollectionConverters._
val javaMap: java.util.Map[String, String] = // ...
val map = javaMap.asScala
// or vice versa if you need to pass it into the Java API
val javaMap = Map("first" -> 1, "second" -> 2).asJava
请注意,asScala
只是底层Java映射的包装(因此,如果该映射是可变的,则包装的映射也将是可变的),并且是scala.collection.map
的一个实例。为了完全惯用并从Scala的不变性保证中获益,您可能需要在末尾添加另一个.toMap
,将其转换为Scala.collection.immutable.Map
(默认映射)
如果您使用scala 2.12或更高版本,而不是
scala.jdk.CollectionConverters.\u
importscala.collection.JavaConverters.\u
仅仅因为表达式`x->y`创建了一个元组(x,y)
。构造函数不能将Tuple2作为参数。好的,这就解释了它。谢谢。我认为JavaConversions
将被弃用。谢谢@Jasper-M,我检查、确认并相应更新了我的答案。
import scala.jdk.CollectionConverters._
val javaMap: java.util.Map[String, String] = // ...
val map = javaMap.asScala
// or vice versa if you need to pass it into the Java API
val javaMap = Map("first" -> 1, "second" -> 2).asJava