【问题标题】:How to convert a Scala Map to a Java Map如何将 Scala Map 转换为 Java Map
【发布时间】:2018-05-03 17:40:15
【问题描述】:

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

TopicPartition(java.lang.String topic, int partition)
OffsetAndMetadata(long offset)

这看起来正确吗?

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 映射? (不知道怎么写)

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

【问题讨论】:

  • 如果您查看错误,您会发现当您需要 java.util.Map 时,您传递了 scala.collection.immutable.Map。这两种类型不一样。
  • 我可以看到。如何解决? (我对 scala 和 java 很陌生)
  • Using scala map in Java的可能重复

标签: java scala


【解决方案1】:

由于各种原因,Scala 拥有自己的标准库,包括自己的集合库,其中包含许多与 Java 中的名称相似甚至完全相同的数据结构。不幸的是,您没有提供Minimal, Complete, and Verifiable example,所以我们必须猜测修复它的正确方法到底是什么。

  1. 如果代码的两边实际上都是 Scala,只需声明 commitSync 以使用 scala.collection.immutable.Map。如果导入发生冲突,您可以使用包的全名或将Map 之一重命名为明确的名称(例如JMap 和/或SMap)为shown here

  2. 1234563 )。

【讨论】:

  • 谢谢。如何模拟 java 调用(这样可以与 Scala 调用相等)?我目前有val kc = mock[org.apache.kafka.clients.consumer.KafkaConsumer[String, Array[Byte]]]kc.commitSync(mapTopicOffset),但这与类型不匹配(Java 调用与 Scala 方法调用)。如何调整该测试用例?谢谢。
  • @Joe,模拟时不能更改签名。 Mock 将具有与原始类型完全相同的签名,实际上这就是模拟的全部意义。如果commitSync 由库定义以使用java.util.Map,则您必须沿路线#2 将Scala Map 转换为Java Map,然后再将其传递给commitSync。附言如果您使用较新的 Scala (2.12) - 使用 scala.collection.JavaConverters
  • @Joe,你看过链接的 ScalaDoc 页面吗? Scala 2.12 中最简单的方法是import scala.collection.JavaConverters._,您可以像kc.commitSync(mapTopicOffset.asJava) 一样使用.asJava
【解决方案2】:

我试图将 Map[String, Double] 传递给 Java 方法。但问题是JavaConversionsMap 转换为java Map,但保留scala 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 2015-01-14
    • 2013-05-11
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    相关资源
    最近更新 更多