在Scala中使用自定义对象遍历java.util.Map

时间:2019-01-23 19:26:39

标签: scala apache-kafka

我是第一次使用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] ^

它在指出错误时指示=>运算符,感谢您的帮助。

1 个答案:

答案 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的转换是由编译器完成的。