java - 简化嵌套 if else 循环 Java 中的认知复杂性

标签 java if-statement sonarqube

我有一个用于构建 native SQL 查询的方法。我有 4 个字符串构建器作为输入,根据不同的条件,我需要构建我的查询。

这是代码

private void appendConditions(StringBuilder query, StringBuilder condition, StringBuilder condition2,
        StringBuilder condition3) {
    if (StringUtils.isNotEmpty(condition.toString())) {
        query.append(ApplicationConstants.AND+"(");
        query.append("( " + condition + " )");
        if (StringUtils.isNotEmpty(condition2.toString())) {
            query.append(ApplicationConstants.AND);
            query.append("( " + condition2 + " )");
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }

        } else {
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }
        }
        query.append(" )");
    } else {
        if (StringUtils.isNotEmpty(condition2.toString())) {
            query.append(ApplicationConstants.AND+"(");
            query.append("( " + condition2 + " )");
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }
            query.append(" )");
        } else {
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND+"(");
                query.append("( " + condition3 + " )");
                query.append(" )");
            }
        }
    }
}

当我运行 Sonar 报告时,它说这种方法的认知复杂性更高。 我可以简化这个方法,避免许多 if-else 循环

谢谢!

最佳答案

简化可以包括概括:具有条件的可变参数。 然后 Stream 解决方案只需几秒钟。

private void appendConditions(StringBuilder query, StringBuilder... conditions) {
    String ands = Stream.of(conditions)
            .map(StringBuilder::toString)
            .filter(StringUtils::isNotEmpty)
            .map(c -> "(" + c + ")")
            .collect(Collectors.joining(ApplicationConstants.AND));
    if (!ands.isEmpty()) {
        query.append(ApplicationConstants.AND).append(ands);
    }
}

如果需要,可以使用Stream.of(condition1,condition2,condition3)

关于java - 简化嵌套 if else 循环 Java 中的认知复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60193545/

相关文章:

java - 我有一些关于 Java 编译器的问题

java - ImageIcon 的 getResources() - java

将歌曲(mp3)与包含其歌词的幻灯片(ppt)匹配的Java程序

sql - 如何在select语句中编写if条件?

java - SonarQube 显示可能的空指针取消引用

java - 用 Batik 写入 unicode 字符不起作用

Java join 2 不包含在一个表达式中

Ruby gets() 没有返回正确的字符串

sonarqube - TFS with SonarQube,没有产品项目,只有测试项目

java - Sonar 4.5.1 中是否已弃用 Xpath 规则