gpt4 book ai didi

java - 通过使用谓词,使用 Collectionutils 将值列表应用为谓词

转载 作者:行者123 更新时间:2023-11-30 03:59:33 25 4
gpt4 key购买 nike

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

这就像 SQL 过滤记录集一样,结果很麻烦。

但是,如果我按照谓词传递列表,则它只需要一个值,即如果我传递 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);

也请从设计角度提出建议。

提前致谢

最佳答案

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

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

您想要评估所有这些,Java 可以方便地为此提供一个 contains() 方法:

return listOfValues.contains(object.getProductId());
<小时/>

除此之外,代码看起来非常糟糕,您应该创建更小的、有针对性的谓词,而不是编写具有许多不同情况的通用谓词。您可以同时摆脱这些 Actor 。

您的混淆也失败了,因为未能用 className 替换一些 SalesOrder(这不尊重 Java 编码标准并且会分散注意力)。

关于java - 通过使用谓词,使用 Collectionutils 将值列表应用为谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22297064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com