在Java8中,如何通过过滤器/谓词的多个组合检索列表对象?
我需要您的帮助,找出用Java8解决这个问题的最佳方法 我有一个必须分类的对象X的列表 这是我的规则集:在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
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;
}