java—同一 predicate 中过滤器的动态数量

jljoyd4f  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(394)

我正在应用一些基于用户输入的过滤器,它可以像预期的那样工作,一旦我可以假设我知道编码时过滤器的数量,在下面的代码中是2。现在,我希望在我的应用程序中根据用户输入动态设置过滤器的数量,因此我正在寻找替代方法,根据需要使用“&&”和“| |”运算符来增加lambda函数。我发现类似的问题,但我找不到一个例子,动态过滤器在同一 predicate 如下。
使用 predicate 函数:

final KStream<String, EventMessage>  filter_stream = stream.filter(IsGoodtoGoFilter(Filters));

private Predicate<String, EventMessage> IsGoodtoGoFilter(String[] Filters)  {
    // Logic to parse Dynamic Filters 
    /// .....
    return (k, v) ->  v.getPayload().getDecodedValue(Column1).toString().equals(Value1) && v.getPayload().getDecodedValue(Column2).toString().equals(Value2);

使用 predicate 测试重写:

final KStream<String, EventMessage>  filter_stream = stream.filter(new Predicate<String, EventMessage>() {
            @Override
            public boolean test(String k, EventMessage v) {
                // Logic to parse Dynamic Filters 
                ///.....
                return v.getPayload().getDecodedValue(Column1).toString().equals(Value1) && v.getPayload().getDecodedValue(Column2).toString().equals(Value2);

                }
            });
ctzwtxfj

ctzwtxfj1#

我建议你授权 java.util.BiPredicate 因为它已经有了所需的操作符。
例如,如果您有一组预定义的 predicate 选项:

BiPredicate<String,EventMessage> isAllUppercase = (st, em) -> st.equals(st.toUppercase());
BiPredicate<String,EventMessage> hasSevenLetters = (st, em) -> st.length() == 7;
BiPredicate<String,EventMessage> containsOnlyNumbers = (st, em) -> st.matches("\\d+");

然后可以根据用户的输入构造一个新 predicate :

BiPredicate<String,EventMessage> filter = isAllUpperCase.and(hasSevenLetters).or(containsOnlyNumbers.negate());

你执行卡卡的 Predicate 然后就可以授权给 filter.test . 事实上,因为它们都是功能接口,所以您可以使用 filter 作为一个 kstream.Predicate .
那以后呢 filter (一) BiPredicate )您的代表团可以是以下任何一个:

Predicate<String, EventMessage> kstreamFilter = (k, v) -> filter.test(k, v);

Predicate<String, EventMessage> kstreamFilter = filter;

或者你可以避开kstream Predicate 总共:

KStream<String, EventMessage> filteredStream = stream.filter(filter);

看到了吗https://en.wikipedia.org/wiki/delegation_pattern 更多关于授权的细节。

相关问题