我是第一次使用Scala编写代码。我正在尝试使用自定义对象作为键值对遍历Java Map。具体来说,在将偏移量提交给Kafka时,我尝试遍历TopicPartitions映射和OffSetMetadata映射。
这是我编写的代码
override def onComplete(map: util.Map[TopicPartition, OffsetAndMetadata], e: Exception): Unit = {
val sb = new StringBuffer()
map.forEach((partition:TopicPartition ,offsets : OffsetAndMetadata) => {
sb.append(partition.topic()+","+partition.partition()+","+offsets.offset()+"\n")
})
但是我收到一个编译错误,说
错误:类型不匹配; 找到:(org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata)=> StringBuffer 需要[错误]:java.util.function.BiConsumer [_>:org.apache.kafka.common.TopicPartition,_>:org.apache.kafka.clients.consumer.OffsetAndMetadata] [错误] map.forEach((partition:TopicPartition,offsets:OffsetAndMetadata)=> { [ERROR] ^
它在指出错误时指示=>运算符,感谢您的帮助。
答案 0 :(得分:3)
我最好的选择是,您使用的Scala 2.11尚未真正意识到Java 8和功能接口。因此,编译器无法自动将Scala lambda转换为匹配的BiConsumer
。根据我的理解,最简单的解决方法是像在
BiConsumer
override def onComplete(map: util.Map[TopicPartition, OffsetAndMetadata], e: Exception): Unit = {
val sb = new StringBuffer()
map.forEach(new java.util.function.BiConsumer[TopicPartition, OffSetMetadata]() {
def accept(partition: TopicPartition, offsets: OffSetMetadata ) = {
sb.append(partition.topic() + "," + partition.partition() + "," + offsets.offset() + "\n")
}
})
}
其他解决方法是先将Java-Map
包装到Scala-Map
中,然后使用Scala接口。当然,您可以升级到Scala 2.12,其中lambda到BiConsumer
的转换是由编译器完成的。