Scala-如何调用需要映射的方法
我有一个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) 是一个
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)。