Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Scala映射转换为Java映射_Java_Scala - Fatal编程技术网

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

如何将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类创建Scala映射:

(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中的名称相似,甚至完全相同。不幸的是,您没有提供一个解决方案,因此我们必须猜测修复该问题的正确方法

  • 如果代码的两面都是Scala,只需声明
    commitSync
    即可使用
    Scala.collection.immutable.Map
    。如果导入中存在冲突,您可以对包使用全名,或者将其中一个
    Map
    重命名为明确的名称(例如
    JMap
    和/或
    SMap

  • 如果这是一个有关Scala和Java代码之间通信的问题,那么Scala为这两种转换提供包装器和转换器,例如or(在Scala 2.12中不赞成使用or,而赞成使用第一种)


  • 我试图将
    映射[String,Double]
    传递给Java方法。但问题是
    JavaConversions
    Map
    转换为java
    Map
    ,但保留scala
    Double
    不变,而不是将其转换为
    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)