我需要将lambda函数作为参数传递给通量YAML配置文件(由Apache Storm使用)中的构造函数或方法。
例如,假设我要创建org.apache.storm.kafka.spout.ByTopicRecordTranslator
的实例。它具有一个带有以下签名的构造函数:
public ByTopicRecordTranslator(Func<ConsumerRecord<K, V>, List<Object>> func, Fields fields)
在Java中,我将这样实例化它:
ByTopicRecordTranslator<String, String> translator = new ByTopicRecordTranslator<>((K) -> new Values(K.value()), new Fields("oneOrMoreStrings"));
但是我似乎无法在助焊剂YAML配置文件中弄清楚该如何做。这是我尝试的代码,但失败了:
- id: "field"
className: "org.apache.storm.tuple.Fields"
constructorArgs:
- ["oneOrMoreStrings"]
- id: "KafkaMessageTranslator"
className: "org.apache.storm.kafka.spout.ByTopicRecordTranslator"
constructorArgs:
- (K) -> new Values(K.value())
- ref: "field"
这是我收到的错误:
Exception in thread "main" java.lang.IllegalArgumentException: Couldn't find a suitable constructor for class 'org.apache.storm.kafka.spout.ByTopicRecordTranslator' with arguments '[(K) -> new Values(K.value()), [oneOrMoreStrings]]'.
at org.apache.storm.flux.FluxBuilder.buildObject(FluxBuilder.java:358)
at org.apache.storm.flux.FluxBuilder.buildComponents(FluxBuilder.java:421)
at org.apache.storm.flux.FluxBuilder.buildTopology(FluxBuilder.java:101)
at some.package.KafkaConsumerTestTopology.main(KafkaConsumerTestTopology.java:20)
我在flux docs中找不到任何相关信息。我相当确定这与我格式化lambda的方式有关。
如何将lambda函数作为参数传递给Flux YAML配置文件中的构造函数或方法?