如何将Scala映射转换为Java映射

时间:2018-05-03 17:40:15

标签: java scala

我正在尝试从2个Java类创建Scala映射:

TopicPartition(java.lang.String主题,int分区)
OffsetAndMetadata(长偏移)

这看起来是否正确?

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地图的重载方法? (不知道怎么写)

或者也许所有内容都应该以不同的方式重写(从创建对象等开始)?

2 个答案:

答案 0 :(得分:1)

由于各种原因,Scala有自己的标准库,包括自己的集合库,其中包含许多相同的数据结构,这些数据结构与Java中的名称相似甚至完全相同。很遗憾你没有提供Minimal, Complete, and Verifiable example所以我们必须猜测究竟是什么方法来解决它。

  1. 如果代码的两边实际上是Scala,只需声明commitSync即可使用scala.collection.immutable.Map。如果导入存在冲突,您可以在包中使用全名,也可以将其中一个Map重命名为明确的名称(例如JMap和/或SMap){ {3}}

  2. 如果这是关于Scala和Java代码之间的通信的问题,那么Scala为转换提供包装器和转换器,例如shown herescala.collection.JavaConverters(在Scala 2.12中不赞成使用第一个)。

答案 1 :(得分:0)

我试图将Map[String, Double]传递给Java方法。但是问题是JavaConversionsMap转换为Java Map,但是将标量Double保留不变,而不是将其转换为java.lang.Double。经过数小时的搜索,我发现[Alvaro Carrasco的答案])https://stackoverflow.com/a/40683561/1612432)就像这样简单:

val scalaMap = // Some Map[String, Double]
val javaMap = scalaMap.mapValues(Double.box)

此后,javaMapMap[String, java.lang.Double]。然后,您可以将其传递给期望Map<String, Double>的java函数,并且由于隐式转换,Scala Map将被转换为java.util.Map

相关问题