在scala中使用java映射

在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 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)

<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
import
scala.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