通过使用pedicates使用Collection Utils将值列表应用为谓词

时间:2014-03-10 10:03:06

标签: java apache guava predicate

我想通过使用谓词来实现数据库系统的功能。

这就像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);

请从设计角度提出建议。

提前致谢

1 个答案:

答案 0 :(得分:2)

您只评估集合中的第一项:

for (Object value : listOfValues) {
    return (object.getProductId() == (Integer) value);
}

您想要评估所有这些,并且Java方便地为此提供contains()方法:

return listOfValues.contains(object.getProductId());

除此之外,代码看起来非常糟糕,您应该创建较小的,有针对性的Predicate,而不是编写具有许多不同情况的通用代码。你可以同时摆脱那些演员阵容。

由于未能将SalesOrder替换为className(这不符合Java编码标准且会分散注意力),您的混淆也失败了。