我想通过使用谓词来实现数据库系统的功能。
这就像SQL过滤记录集一样,结果很麻烦。
但是如果我在谓词中传递List只需要一个值,即如果我通过53和54它只过滤53的结果。
public class classNamePredicate implements Predicate<className> {
private Object expected1;
private String property;
private List<Object> listOfValues = new ArrayList<Object>();
public SalesOrderPredicate(Object expected1, String property) {
super();
this.expected1 = expected1;
this.property = property;
}
public SalesOrderPredicate(List<Object> listValues, String property) {
this.listOfValues = listValues;
this.property = property;
}
@Override
public boolean evaluate(SalesOrder object) {
try {
if (property.equals("volume")) {
return ((Integer) expected1 < object.getVolume());
}
if (property.equals("startDateId")) {
return (expected1.equals(object.getStartDateId()));
}
if (property.equals("endDateId")) {
return (expected1.equals(object.getEndDateId()));
}
if (property.equals("productIds")) {
for (Object value : listOfValues) {
return (object.getProductId() == (Integer) value);
}
}
if (property.equals("sourceIds")) {
for (Object value : listOfValues) {
return (object.getSourceId() == (Integer) value);
}
}
return false;
} catch (Exception e) {
return false;
}
}
}
我试图按照以下方式使用它:
List<Object> productIds = new ArrayList<Object>();
productIds.add(53);
productIds.add(54);
List<Object> sourceIds = new ArrayList<Object>();
sourceIds.add(122);
Predicate[] classnameOrderPredicate = { (Predicate) new classnamePredicate(4415, "startDateId"),
(Predicate) new classnamePredicate(4443, "endDateId"), (Predicate) new classnamePredicate(100000, "volume"),
(Predicate) new classnamePredicate(productIds, "productIds"), (Predicate) new classnamePredicate(sourceIds, "sourceIds") };
Predicate classnameallPredicateGeneric = (Predicate) PredicateUtils
.allPredicate((org.apache.commons.collections4.Predicate<? super classname>[]) classnamePredicate);
Collection<classname> classnamefilteredCollectionGeneric = GenericCollectionUtils.select(classname, classnameallPredicateGeneric);
请从设计角度提出建议。
提前致谢
答案 0 :(得分:2)
您只评估集合中的第一项:
for (Object value : listOfValues) {
return (object.getProductId() == (Integer) value);
}
您想要评估所有这些,并且Java方便地为此提供contains()
方法:
return listOfValues.contains(object.getProductId());
除此之外,代码看起来非常糟糕,您应该创建较小的,有针对性的Predicate
,而不是编写具有许多不同情况的通用代码。你可以同时摆脱那些演员阵容。
由于未能将SalesOrder
替换为className
(这不符合Java编码标准且会分散注意力),您的混淆也失败了。