Итерация по java.util.Map с пользовательскими объектами в Scala - PullRequest
0 голосов
/ 23 января 2019

Я новичок в написании кода на Scala.Я пытаюсь перебрать Java-карту с пользовательскими объектами в виде пар ключ-значение.В частности, я пытаюсь просмотреть карту TopicPartitions и OffSetMetadata Map при фиксации смещений в Kafka.

Вот код, который я написал

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] [ERROR] map.forEach ((partition: TopicPartition, смещения: OffsetAndMetadata) => {[ERROR] ^

Указывает на оператор => при указании ошибки, любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 января 2019

Лучшее, что я могу сделать, это то, что вы используете Scala 2.11, которая до сих пор не знает Java 8 и функциональных интерфейсов. Вот почему компилятор не может автоматически конвертировать вашу лямбду Scala в соответствующий 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, где это преобразование лямбды в BiConsumer выполняется компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...