spring 如何优化具有多个规范的if else状态机

yyhrrdl8  于 2022-12-02  发布在  Spring
关注(0)|答案(1)|浏览(148)

我正在尝试创建基于请求主体中发送的字段的动态搜索。我准备了许多规范,并在“摘要规范”(在方法中调用)中,我希望在字段不是空的情况下调用它们。它可以工作,但问题是我永远不知道哪个参数将开始创建条件,所以我不得不添加布尔参数,这导致了许多if else语句的创建。代码:

public Specification<ShapeEntity> conditionalSearch(ShapeParams shapeParams) {
    Specification spec = null;
    boolean isFirstParam = true;
    if (shapeParams.getType() != null) {
        if (isFirstParam) {
            spec = Specification.where(isTypeEqual(shapeParams.getType()));
            isFirstParam = false;
        } else {
            spec = spec.and(isTypeEqual(shapeParams.getType()));
        }
    }

    if (shapeParams.getWidthTo() != null) {
        if (isFirstParam) {
            spec = Specification.where(isWidthLessThan(shapeParams.getWidthTo()));
            isFirstParam = false;
        } else {
            spec = spec.and(isWidthLessThan(shapeParams.getWidthTo()));
        }
    }

    if (shapeParams.getWidthFrom() != null) {
        if (isFirstParam) {
            spec = Specification.where(isWidthGreaterThan(shapeParams.getWidthTo()));
            isFirstParam = false;
        } else {
            spec = spec.and(isWidthGreaterThan(shapeParams.getWidthTo()));
        }
    }
    return spec;
}

有什么方法可以优化它吗?规范必须总是以“.where”作为第一个开始,接下来我可以添加其他条件,我甚至希望有10+个参数

9bfwbjaz

9bfwbjaz1#

您可以编写一些方法来接收一些值以进行验证并返回boolean。

boolean checkType(CustomObject type){
    return type == null;
}

您可以检查Optional的使用,它可能对一些if块有帮助。

Optional.ofNullable(type).ifPresent(t -> /*some operations*/);

您可以检查是否可以合并某些条件。

if (shapeParams.getType() != null && isFirstParam) {
     //do something....
} else {
     //do other....    
}

相关问题