如何将Scala映射转换为Java映射
我正在尝试从两个Java类创建Scala映射:如何将Scala映射转换为Java映射,java,scala,Java,Scala,我正在尝试从两个Java类创建Scala映射: (java.lang.String主题,int分区) (长偏移) 这看起来正确吗? val topicPartition = new TopicPartition("sometopicname", 99) val offsetAndMetadata = new OffsetAndMetadata(999999L,"tette") val mapTopicOffset = Map(topicPartition -> offsetAndMeta
(java.lang.String主题,int分区)
(长偏移) 这看起来正确吗?
val topicPartition = new TopicPartition("sometopicname", 99)
val offsetAndMetadata = new OffsetAndMetadata(999999L,"tette")
val mapTopicOffset = Map(topicPartition -> offsetAndMetadata)
还需要创建一个方法,该方法将接受此映射作为输入参数
尝试了类似于:
def commitSync(offsets: Map[TopicPartition, OffsetAndMetadata] ) = {
}
出现错误:
Error:(239, 37) type mismatch;
found : Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata] (in scala.collection.immutable)
required: Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata] (in java.util)
verify(kc, times(1)).commitSync(mapTopicOffset)
有没有一种方法可以提供采用scala映射的重载方法?
(不知道怎么写)
或者,一切都应该以不同的方式重写(从创建对象开始等等)?出于各种原因,Scala有自己的标准库,包括自己的集合库,其中有许多相同的数据结构,与Java中的名称相似,甚至完全相同。不幸的是,您没有提供一个解决方案,因此我们必须猜测修复该问题的正确方法
commitSync
即可使用Scala.collection.immutable.Map
。如果导入中存在冲突,您可以对包使用全名,或者将其中一个Map
重命名为明确的名称(例如JMap
和/或SMap
)我试图将
映射[String,Double]
传递给Java方法。但问题是JavaConversions
将Map
转换为javaMap
,但保留scalaDouble
不变,而不是将其转换为java.lang.Double
。经过几个小时的研究,我发现(阿尔瓦罗·卡拉斯科的答案),这很简单:
val scalaMap = // Some Map[String, Double]
val javaMap = scalaMap.mapValues(Double.box)
在此之后,
javaMap
是一个Map[String,java.lang.Double]
。然后,您可以将其传递给需要Map
的java函数,由于隐式转换,Scala映射将转换为java.util.Map
如果查看错误,您将看到在需要java.util.Map
时传递的是Scala.collection.immutable.Map
。这两种类型不一样。我可以看出。如何修复它?(我对scala和java非常陌生)可能是重复的谢谢。如何模拟java调用(以便与Scala调用相同)?我目前有val kc=mock[org.apache.kafka.clients.consumer.KafkaConsumer[String,Array[Byte]]
和kc.commitSync(mapTopicOffset)
,但这与类型(Java调用与Scala方法调用)不匹配。如何调整该测试用例?谢谢。@Joe,你不能在嘲弄时更改签名。Mock将具有与原始类型完全相同的签名,实际上这就是Mock的全部意义。如果库将commitSync
定义为使用java.util.Map
,则在将其传递给commitSync
之前,您必须沿着路径2将Scala映射转换为java映射。另外,如果您使用的是较新的Scala(2.12)-请使用@Joe,您是否查看了链接的ScalaDoc页面?Scala 2.12中最简单的方法是导入Scala.collection.JavaConverters.\u
和kc.commitSync(mapTopicOffset.asJava)