Java Kafka流-基于动态条件数的连接谓词

Java Kafka流-基于动态条件数的连接谓词,java,apache-kafka,stream,predicate,Java,Apache Kafka,Stream,Predicate,我对Java有点陌生,所以我希望您能给我一些建议来处理Kafka谓词中的多个条件。我有以下代码,我能够基于动态输入使用动态过滤器,并避免下面的“if/elseifs”?。我将代码保持简单和愚蠢,以便更容易理解我要做的事情。我正试图了解,作为用户输入的结果,应用/附加多少过滤器的推荐方法是什么。我还想知道是否有可能基于用户输入(equals/contains/…)使用比较运算符 公共拓扑构建拓扑(属性envProps){ 最终StreamsBuilder生成器=新StreamsBuilder();

我对Java有点陌生,所以我希望您能给我一些建议来处理Kafka谓词中的多个条件。我有以下代码,我能够基于动态输入使用动态过滤器,并避免下面的“if/elseifs”?。我将代码保持简单和愚蠢,以便更容易理解我要做的事情。我正试图了解,作为用户输入的结果,应用/附加多少过滤器的推荐方法是什么。我还想知道是否有可能基于用户输入(equals/contains/…)使用比较运算符

公共拓扑构建拓扑(属性envProps){
最终StreamsBuilder生成器=新StreamsBuilder();
最后一个字符串inputTopic=envProps.getProperty(“input.topic.name”);
最后一个字符串streamsoutputopic=envProps.getProperty(“streams.approved.topic.name”);
最终字符串tableOutputTopic=envProps.getProperty(“table.output.topic.name”);
final Serde stringSerde=Serdes.String();
final KStream stream=builder.stream(inputTopic,consumered.with(stringSerde,StreamsSerdes.ClientTask());
字符串[]过滤器={“状态=正在进行的工作”,“优先级=高”};
最终KStream filter_stream=stream.filter(IsGoodtoGoFilter(Filters));
过滤流到(streamsOutputTopic,producted.with(stringSerde,StreamsSerdes.ClientTask());
返回builder.build();
} 
公共静态谓词IsGoodtoGoFilter(字符串[]筛选器){
ArrayList GetColumn=新的ArrayList();
ArrayList GetValue=新建ArrayList();
用于(字符串过滤器列:过滤器){
字符串[]ColumnAndValue=FilterColumn.split(“=”);
GetColumn.add(ColumnAndValue[0]);
add(ColumnAndValue[1]);
}
if(GetColumn.size()==1){
返回(k,v)->v.get(GetColumn.get(0)).toString().equals(GetValue.get(0));
}
else if(GetColumn.size()==2){
return(k,v)->v.get(GetColumn.get(0)).toString()等于(GetValue.get(0))&&
v、 get(GetColumn.get(1)).toString()等于(GetValue.get(1));
}
return(k,v)->v.getStatus().equals(“Open”);//稍后替换为空谓词
}

用例是什么?过滤器是在编译时定义的还是在运行时创建/更新的(作为用户输入等的结果)第二个过滤器。我正试图了解,作为用户输入的结果,应用/附加多少过滤器的推荐方法是什么。我还想知道是否有可能基于用户输入(equals/contains/…)使用比较运算符。
    public Topology buildTopology(Properties envProps) {
        final StreamsBuilder builder = new StreamsBuilder();
        final String inputTopic = envProps.getProperty("input.topic.name");
        final String streamsOutputTopic = envProps.getProperty("streams.approved.topic.name");
        final String tableOutputTopic = envProps.getProperty("table.output.topic.name");
        final Serde<String> stringSerde = Serdes.String();
        final KStream<String, ClientTask> stream = builder.stream(inputTopic, Consumed.with(stringSerde,StreamsSerdes.ClientTask()));    
        String[] Filters = {"State=Work In Progress","Priorit=High"};
        final KStream<String, ClientTask> filter_stream = stream.filter(IsGoodtoGoFilter(Filters));
        filter_stream.to(streamsOutputTopic, Produced.with(stringSerde, StreamsSerdes.ClientTask()));           
        return builder.build();
    } 
    public static Predicate<String, ClientTask> IsGoodtoGoFilter(String[] Filters) {
        ArrayList<String> GetColumn = new ArrayList<>();
        ArrayList<String> GetValue = new ArrayList<>();
        for (String FilterColumn: Filters)       {
            String[] ColumnAndValue = FilterColumn.split("=");
            GetColumn.add(ColumnAndValue[0]);
            GetValue.add(ColumnAndValue[1]);
        }
        if (GetColumn.size() == 1) {
            return (k, v) -> v.get(GetColumn.get(0)).toString().equals(GetValue.get(0));
        }
        else if (GetColumn.size() == 2) {
            return (k, v) -> v.get(GetColumn.get(0)).toString().equals(GetValue.get(0)) &&
            v.get(GetColumn.get(1)).toString().equals(GetValue.get(1));
        }
        return (k, v) -> v.getStatus().equals("Open"); // replace by empty predicate later
    }