Scala-如何调用需要映射的方法

Scala-如何调用需要映射的方法,scala,hashmap,Scala,Hashmap,我有一个scala方法: def commitSync(offsets: Map[TopicPartition, OffsetAndMetadata]) = { consumer.commitSync(offsets.asJava) } 是一个具有两个参数(String和Int)的类: TopicPartition(java.lang.String主题,int分区)在scala中制作如下: val-tp=newtopicpartition(“sometopicname”,99) 是一个

我有一个scala方法:

def commitSync(offsets: Map[TopicPartition, OffsetAndMetadata]) = {
   consumer.commitSync(offsets.asJava)
}
是一个具有两个参数(
String
Int
)的类:
TopicPartition(java.lang.String主题,int分区)

在scala中制作如下:

val-tp=newtopicpartition(“sometopicname”,99)


是一个公共卡夫卡类,其中包含“long”类型:
OffsetAndMetadata​(长偏移量)

现在如何使用这两个参数调用方法
commitSync


谢谢。

假设您声明了两个案例类

case class TopicPartition(str:String,intVal:Int)
case class OffsetAndMetadata(longVal:Long)
现在,使用这些值创建一个贴图

val offsets = Map(TopicPartition("sometopicname", 99) -> OffsetAndMetadata(999999))
现在,您可以将函数commitSync作为

commitSync(offsets)

我希望这能回答你的问题

在函数调用中创建映射:

def commitSync(input: Map[String, Int]) = ??? // whatever

commitSync(Map("my string" -> 10))

或者,您可以将映射定义为
val
,并将其作为参数传入

val map = Map("my string" -> 10)

commitSync(map)

具体来说,在您的示例中,类似这样的内容将起作用:

case class TopicPartition(val1: String, val2: Int)
case class OffsetAndMetadata(val1: Long)

def commitSync(input: Map[TopicPartition, OffsetAndMetadata]) = ??? // whatever

val map = Map(TopicPartition("string", 123) -> OffsetAndMetadata(1234567890))

commitSync(map)

谢谢使用
val tp=new-TopicPartition(“sometopicname”,99)
case-class-TopicPartition(str:String,intVal:Int)
有什么区别?首先,您调用的是
类的新实例。另一方面,您正在定义一个
案例类
,就像定义函数或变量一样。Case类非常适合存储数据和函数,因为它们在幕后生成了很多有用的东西,您必须用Java之类的语言显式地写出这些东西。要创建一个新的case类,您只需执行
val tp=TopicPartition(“sometopicname”,99)
(case类的一个特性是
new
关键字是多余的)。@Joe如果您还有任何疑问,请告诉我,以便我可以澄清。如果答案足够,请接受解决方案。@Joe更多关于案例类的信息,请点击这里:)谢谢James和Chaitanya!获取类型不匹配错误:
错误:(224,25)类型不匹配;找到:scala.collection.immutable.Map[TopicPartition,OffsetAndMetadata]必需:Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata]consumer.commitSync(Map)
(已尝试所有示例).我以为您使用的是自己的类
TopicPartition
OffsetAndMetadata
,而不是一些预定义的类。如果您去掉
case类
定义并将映射更改为
映射(新的TopicPartition(“string”,123)->新的OffsetAndMetadata(1234567890))
,它能工作吗?答案的要点是,如果您想将映射作为参数传递,需要以我建议的格式编写它。例如,如果您有一个函数
def function(输入:Map[String,String])
,那么您将使用类似“val Map=Map”(“w”->“x”,“y”->“z”)(等)的内容创建映射。与中一样,
Map[LeftThing,RightThing]
写为
Map(LeftThing->RightThing,LeftThing->RightThing)
(箭头在它们之间,不同的条目之间用逗号分隔);val map=map(新的主题分区(“字符串”,123)->新的偏移量和元数据(1234567890));commitSync(映射)::错误:(224,78)类型不匹配;找到:Int(1234567890)必需:kafka.common.OffsetMetadata val map=map(新主题分区(“字符串”,123)->新OffsetAndMetadata(1234567890));错误:(229,25)类型不匹配;找到:scala.collection.immutable.Map[org.apache.kafka.common.TopicPartition,kafka.common.OffsetAndMetadata]必需:Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata]抱歉。已编辑的问题,带有指向该类的超链接(OffsetAndMetadata)。