QFilter链式封装原创
8人赞赏了该文章
62次浏览
编辑于2024年07月12日 16:30:12
![封面](/download/01002f45b782795e4738b12a3e4f8de9f53e.jpg)
背景:java 8 以后,我们经常会见到写出链式的代码。前面N多行是构建用的参数,简单明了,最后的执行。那么我们的QFilter是否能封装成这个样子呢?在未封装之前代码调用是这样子。
未封装前实例:
List<QFilter> qFilters = new ArrayList<>();
......
设置值
DynamicObject dy = BusinessDataServiceHelper.loadSingle(entityId, qFilters.toArray(new QFilter[0]));
是平铺的。
封装后的实例:
DynamicObject dy = QFilterBuilder.andEqualKey(key,val).andThen(andEqualKey(key,val))
.....
.andThen(queryOne(fields)).applay(new Pair<>(entityId,null));
代码如下:
public class QFilterBuilder {private static boolean existsProperty(String entityId, String key) {
if (StringUtils.isBlank(entityId) || StringUtils.isBlank(key)) {
return false ;
}
DynamicObject entity = BusinessDataServiceHelper.newDynamicObject(entityId);
return entity.getDynamicObjectType().getProperties().containsKey(key);
}
private static Function<Pair<String, QFilter>, Pair<String, QFilter>> andEqual(String key, Object val) {
return (pair) -> {
boolean isExists = existsProperty(pair.getKey(), key);
if (isExists) {
if (Objects.isNull(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.equals, val));
} else {
pair.getValue().and(new QFilter(key, QCP.equals, val));
}
}
return pair;
};
}
private static Function<Pair<String, QFilter>, Pair<String, QFilter>> orEqual(String key, Object val) {
return (pair) -> {
boolean isExists = existsProperty(pair.getKey(), key);
if (isExists) {
if (Objects.isNull(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.equals, val));
} else {
pair.getValue().or(new QFilter(key, QCP.equals, val));
}
}
return pair;
};
}
private static Function<Pair<String, QFilter>, Pair<String, QFilter>> andIn(String key, Object val) {
return (pair) -> {
boolean isExists = existsProperty(pair.getKey(), key);
if (isExists) {
if (Objects.isNull(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.in, val));
} else {
pair.getValue().and(new QFilter(key, QCP.in, val));
}
}
return pair;
};
}
private static Function<Pair<String, QFilter>, Pair<String, QFilter>> orIn(String key, Object val) {
return (pair) -> {
boolean isExists = existsProperty(pair.getKey(), key);
if (isExists) {
if (Objects.isNull(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.in, val));
} else {
pair.getValue().or(new QFilter(key, QCP.in, val));
}
}
return pair;
};
}
/**
* 放在链条的最后
* @param fields
* @return
*/
public static Function<Pair<String, List<QFilter>>, DynamicObject> queryOne(String fields) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue()) || StringUtils.isBlank(pair.getKey())) {
return null;
}
if (StringUtils.isBlank(fields)) {
return BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), pair.getValue().toArray(new QFilter[0]));
}
return BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), fields, pair.getValue().toArray(new QFilter[0]));
};
}
/**
* 放在链条的最后
* @return
*/
public static Function<Pair<String, List<QFilter>>, Long> queryOnePk() {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue()) || StringUtils.isBlank(pair.getKey())) {
return null;
}
DynamicObject dy = BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), "id", pair.getValue().toArray(new QFilter[0]));
return isEmpty(dy) ? null : dy.getLong("id");
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualKey(String key, Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
pair.getValue().add(andEqual(key, val).apply(new Pair<>(pair.getKey(), null)).getValue());
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualNumber(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("number", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualIsCurrentVersion(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("iscurrentversion", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualDataStatus(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("datastatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBusinessStatus(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("businessstatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualIsPrimary(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("isprimary", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBillNo(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("billno", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBillStatus(Object val) {
return (pair) -> {
if (CollectionUtils.isEmpty(pair.getValue())) {
pair = new Pair<>(pair.getKey(), new ArrayList<>());
}
Optional<QFilter> optional = Optional.ofNullable(andEqual("billstatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
if (optional.isPresent()) {
pair.getValue().add(optional.get());
}
return pair ;
};
}
// 人员编码通用过滤器
public static Function<Pair<String,List<QFilter>>,Pair<String,List<QFilter>>> andEqualEmployeeNumber(String employeeNumber) {
return (pair) -> {
return andEqualNumber(employeeNumber)
.andThen(andEqualIsCurrentVersion("1"))
.andThen(andEqualDataStatus("1"))
.andThen(andEqualBusinessStatus("1"))
.apply(pair);
};
}
=====end====
结束语:有喜欢链式的小伙伴,可以尝试把andThen去掉。如果有其他思路记得留言。