scala - 在 Scala 中使用 java Map

标签 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)

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

有人可以帮助解释这里发生了什么吗?

最佳答案

java.util.HashMap 不提供通过传递 (K, V) 的可变参数来构造映射的功能,但是有一个接受 initialCapacity: IntloadFactor: Float 的双参数构造函数,这就是为什么您会收到有关需要 Float 的编译错误的原因。
(针对 Scala 2.13+ 更新)Scala 中的惯用方法是仅使用 Scala 不可变映射(无需导入):

val map = Map("first" -> 1, "second" -> 2).asJava
如果您的 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(这是默认 Map)。
如果您使用 scala 2.12 或更早版本,请使用 scala.jdk.CollectionConverters._ import scala.collection.JavaConverters._ 代替。

关于scala - 在 Scala 中使用 java Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37829536/

相关文章:

scala - 如何在不从 DataFrame 转换并访问它的情况下向 Dataset 添加列?

scala - 在 Scala 中拆分出 3 个或更多数组

scala - 在 Spark Scala 中动态创建数据帧

scala - 无法在YARN群集上运行Spark作业

scala - 组合序列的惯用 Scala 解决方案

scala - Char或String-> Scala中的Unicode值?

scala - UUID 路径可绑定(bind) - Play Framework

scala - 检索将分配给 Scala 宏调用的值的名称

scala - com.paypal.core.rest.PayPalRESTException :Read timed out

java - Spark 的额外记录器位于特定任务的单独文件中