[英]How to retrieve a list objects by multiple combination of filters/predicates in Java 8?
我需要你的幫助來找出在 java 8 中解決這個問題的最佳方法
我有一個必須分類的對象 X 列表。
這是我的規則集:
ID | Filtre1 | Filtre2 | Filtre3 | ValueToApply
1 | 'abc' | null | null | 10
2 | 'abc' | 'def' | null | 25
3 | 'abc' | null | 'ghi' | 20
案例 1:我有一個包含 (value1=abc, value2=def, value3=ghi) 的對象 X,因此代碼應該返回具有規則 1、2、3 的列表
案例 2:我有一個包含 (value1=abc, value2=def, value3=hij) 的對象 X,因此代碼應該返回具有規則 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;
}
}
然后使用它們與數據中建議的主要方法:
public static void main(String[] args) {
X x1 = new X("abc", "def", "ghi");
X x2 = new X("abc", "def", "hij");
List<Rule> rules = new ArrayList<>(Arrays.asList(
new Rule(1, 10, v->"abc".equals(v)),
new Rule(2, 25, v->"abc".equals(v), v->"def".equals(v)),
new Rule(3, 20, v->"abc".equals(v), v->true, v->"ghi".equals(v))
));
Collection<Rule> rulesResult = classify(x1, rules);
System.out.println("Case 1:"+rulesResult);
rulesResult = classify(x2, rules);
System.out.println("Case 2:"+rulesResult);
}
預期結果:
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;
}
沒什么大不了的。 rule.valueFilters.length > i
就在那里,因此您不必在所有返回 true 的規則中指定尾隨過濾器。
我確信可以使用流,但可讀性是有問題的,而且很可能對於像這樣的批處理作業效率不高,因為沒有提前終止/延遲評估的好處。
循環 X 類的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.