输入Cast Map [String,Object]到Map [String,String]

时间:2017-10-10 19:15:02

标签: java scala sbt scala-collections

我是scala的新手,我看到以下异常:

value mapValues is not a member of java.util.Map[String,Object]
[error]  headers = Option(data).map(_.mapValues(_.toString)).getOrElse(Map()),
[error]                               ^

以下是摘录:

import scala.collection.JavaConverters._
def toMessage(properties: AMQP.BasicProperties, body: Array[Byte]): Message = {
    Message (
        headers = Option(data).map(_.mapValues(_.toString)).getOrElse(Map())) <<----- THIS LINE HAS PROBLEMS!!!
}

我知道headers的数据类型为Map[String, String],而data的数据类型为Map<String, Object>。我如何输入这个来解决这个问题?

更新

做出Alvaro和Tanjin建议的修改。现在我得到了这个例外:

现在我明白了:

[error]  found   : Map[String,String] (in scala.collection)
[error]  required: Map[String,String] (in scala.collection.immutable)
[error]       headers         = Option(properties.getHeaders).map(_.asScala.mapValues(_.toString)).getOrElse(Map())
[error]                                                                                                     ^

2 个答案:

答案 0 :(得分:2)

data类似于java.util.Map[...],但mapValues方法位于scala.collection.Map[...]。因此,您需要使用.asScala方法对其进行转换(由JavaConverters导入隐式提供:

Option(data).map(_.asScala.toMap.mapValues(_.toString)).getOrElse(Map.empty))

同时添加.toMap,因为.asScala会返回一个可变的Map ... .toMap使其不可变。

答案 1 :(得分:1)

这是如何运作的?

import scala.collection.JavaConverters._
def toMessage(properties: AMQP.BasicProperties, body: Array[Byte]): Message = {
  Message (
    headers = Option(data)
      .map(_.asScala)
      .getOrElse(collection.immutable.Map.empty)
      .mapValues(_.toString)
}