我是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] ^
答案 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)
}