在Java8中,如何通过过滤器/谓词的多个组合检索列表对象?

在Java8中,如何通过过滤器/谓词的多个组合检索列表对象?,java,list,predicate,steam,Java,List,Predicate,Steam,我需要您的帮助,找出用Java8解决这个问题的最佳方法 我有一个必须分类的对象X的列表 这是我的规则集: ID | Filtre1 | Filtre2 | Filtre3 | ValueToApply 1 | 'abc' | null | null | 10 2 | 'abc' | 'def' | null | 25 3 | 'abc' | null | 'ghi' | 20 案例1:我有一个对象X包含(value1=abc,v

我需要您的帮助,找出用Java8解决这个问题的最佳方法

我有一个必须分类的对象X的列表

这是我的规则集:

ID  | Filtre1 | Filtre2 | Filtre3 | ValueToApply
1   |  'abc'  |  null   |  null   |  10
2   |  'abc'  |  'def'  |  null   |  25 
3   |  'abc'  |  null   |  'ghi'  |  20
案例1:我有一个对象X包含(value1=abc,value2=def, value3=ghi),因此代码应该返回带有规则1、2、3的列表

案例2:我有一个对象X包含(value1=abc,value2=def, value3=hij),因此代码应该返回带有规则1、2的列表

谢谢,但是“最好的方法”很模糊。这里有一种解释,它至少是一个很好的起点,它结合了一系列过滤对象中字段的规则,这些规则是可扩展的,不限于字段或对象的数量,易于互换的类型等

首先,让我们定义一些数据对象来捕获数据模型:

static class Rule {
    final int id;
    final int valueToApply;
    final Predicate<String>[] valueFilters;

    public Rule(int id, int valueToApply, Predicate<String>... valueFilters) {
        this.id = id;
        this.valueToApply = valueToApply;
        this.valueFilters = valueFilters;
    }

    @Override
    public String toString() {
        return "Rule{id="+id+", valueToApply="+valueToApply+"}";
    }
}

static class X {
    final String[] values;

    X(String... values) {
        this.values = values;
    }
}
以及分类方法的“魔力”

static Collection<Rule> classify(X x, Collection<Rule> rules) {
    List<Rule> result = new ArrayList<>();

    for (Rule rule : rules) {
        for (int i = 0; i < x.values.length; i++) {
            if (rule.valueFilters.length > i && !rule.valueFilters[i].test(x.values[i]))
                continue;
            if (i == x.values.length-1)
                result.add(rule);
        }
    }

    return result;
}
静态集合分类(X X,集合规则){
列表结果=新建ArrayList();
for(规则:规则){
对于(int i=0;ii&!rule.valueFilters[i].test(x.values[i]))
继续;
如果(i==x.values.length-1)
结果。添加(规则);
}
}
返回结果;
}
没什么大不了的。存在
rule.valueFilters.length>i
,因此您不必在规则中指定所有返回true的尾部过滤器

我确信可以使用streams,但是可读性会有问题,如果没有提前终止/延迟评估的好处,那么对于这样的批处理作业来说,很可能没有效率


循环类X的对象。

定义“解决此代码的最佳方法”。GBLODGET是什么意思?
Case 1:[Rule{id=1, valueToApply=10}, Rule{id=2, valueToApply=25}, Rule{id=3, valueToApply=20}]
Case 2:[Rule{id=1, valueToApply=10}, Rule{id=2, valueToApply=25}]
static Collection<Rule> classify(X x, Collection<Rule> rules) {
    List<Rule> result = new ArrayList<>();

    for (Rule rule : rules) {
        for (int i = 0; i < x.values.length; i++) {
            if (rule.valueFilters.length > i && !rule.valueFilters[i].test(x.values[i]))
                continue;
            if (i == x.values.length-1)
                result.add(rule);
        }
    }

    return result;
}