【问题标题】:Exposing Java method (with parameters) in Scala? [duplicate]在Scala中公开Java方法(带参数)? [复制]
【发布时间】:2018-08-11 06:20:53
【问题描述】:

我正在尝试通过 Scala 公开 Java 方法(有关原始 Java 方法的更多详细信息 - 它来自 Kafka

这是原始的Java方法:

public void resume(Collection<TopicPartition> partitions)

如何向 Scala 中的方法公开和传递参数,以及在这种情况下使用哪个 Scala 集合?
我有类似的东西:

import org.apache.kafka.clients.consumer.{KafkaConsumer, OffsetAndMetadata}
import org.apache.kafka.common.TopicPartition

import collection.mutable.Map
import collection.JavaConverters._

//initialise consumer:
var consumer = createKafkaConsumer(config, subscriptions)

//accept a scala.collection.mutable.Map here
def commitSync(offsets: scala.collection.mutable.ArrayBuffer) = {
    //and then convert it to a java
    consumer.resume(offsets.asJava)
}

另外,如何在 Scala 中调用(并传递参数)这个方法?
谢谢。

【问题讨论】:

  • 你在哪里调用resume函数?你试过什么?
  • 我的错。已编辑。
  • 看起来一切正常。你有错误吗?有什么问题?
  • 你想达到什么目的?
  • 它抱怨Type ArrayBuffer takes Type parameter(在 IDE 中键入时)。我正在尝试通过 scala 公开 Java 方法,以便在 scala 中使用库的人可以访问 Java 方法。为了访问 Java Kafka 方法 - 我需要创建 Scala 方法,它将 1)具有良好的签名(尚不确定哪个是好的)2)制作工作示例 - 使用参数调用该 Scala 方法和 3)确保它可以调用底层 Java Kafka 方法并传递适当的参数...

标签: java scala apache-kafka


【解决方案1】:

更新

啊,对。试试这个:

import org.apache.kafka.clients.consumer.KafkaConsumer
import org.apache.kafka.common.TopicPartition

import collection.mutable.ArrayBuffer
import collection.JavaConverters._

//initialise consumer:
val consumer = createKafkaConsumer(config, subscriptions) // Make this a val!

//accept a scala.collection.mutable.ArrayBuffer here
def commitSync(offsets: ArrayBuffer[TopicPartition]) = {
  //and then convert it to a java
  consumer.resume(offsets.asJava)
}

看起来 ArrayBuffer 需要包含TopicPartition 实例,以便将其转换为TopicPartitionJava 集合,以便resume 调用起作用。

Scala 中,您总是需要输入集合的类型参数。

我假设您知道 TopicPartition 实例的外观,因为它是 Kafka 的一部分。 (阅读API Docs if you're unsure。)

为了调用commitSync 函数,您需要ArrayBufferTopicPartition 实例。例如:

val topics: ArrayBuffer[TopicPartition] = ArrayBuffer(
  new TopicPartition("sometopicname", somePartitionNum),
  new TopicPartition("someothertopic", someOtherPartitionNum),
  // etc.
)
commitSync(topics)

【讨论】:

  • 谢谢!这个方法的调用(签名)是什么样子的?
  • @Joe 我编辑了答案以显示应该如何调用它。
  • 谢谢!我看到TopicPartition​(java.lang.String topic, int partition) 那么它应该是val topics: ArrayBuffer[TopicPartition] = ('mytopicname', partition-num) 模式(只是想填补上面的空白-> //....)?
  • @Joe 进一步澄清了答案。这能回答你的问题吗?
  • 使用ArrayBuffer而不是List的原因是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-11-17
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多