You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中将含括号或不含括号的逻辑表达式表示为对象?

最优Java逻辑表达式表示方案:基于AST的多态设计

1. 核心思路:拆分原子与复合条件

别再用单一类硬塞所有逻辑了,直接把表达式拆成两种核心类型:

通过多态设计,让不同类型的表达式各自负责自己的逻辑,完美解决嵌套问题。

2. 代码实现示例

先定义一个抽象接口,所有表达式都得实现求值方法:

public interface Expression {
    boolean evaluate();
}

然后是原子条件类,处理单个判断逻辑:

public class AtomicCondition implements Expression {
    // 这里可以换成实际业务判断,比如检查某个字段状态
    private final boolean value;

    public AtomicCondition(boolean value) {
        this.value = value;
    }

    @Override
    public boolean evaluate() {
        return value;
    }
}

再做复合条件类,专门处理AND/OR组合,支持嵌套任意层级:

public enum LogicalOperator {
    AND, OR
}

public class CompositeCondition implements Expression {
    private final LogicalOperator operator;
    private final List<Expression> subExpressions;

    public CompositeCondition(LogicalOperator operator, List<Expression> subExpressions) {
        this.operator = operator;
        this.subExpressions = subExpressions;
    }

    @Override
    public boolean evaluate() {
        switch (operator) {
            case AND:
                return subExpressions.stream().allMatch(Expression::evaluate);
            case OR:
                return subExpressions.stream().anyMatch(Expression::evaluate);
            default:
                throw new IllegalArgumentException("未知操作符: " + operator);
        }
    }
}

3. 使用示例:构造复杂嵌套表达式

比如你要实现 <A AND (B OR (C AND D AND E))>,代码可以这么写:

public class Main {
    public static void main(String[] args) {
        // 定义各个原子条件
        Expression a = new AtomicCondition(true);
        Expression b = new AtomicCondition(false);
        Expression c = new AtomicCondition(true);
        Expression d = new AtomicCondition(true);
        Expression e = new AtomicCondition(true);

        // 层层嵌套构造复合表达式
        Expression cAndDAndE = new CompositeCondition(LogicalOperator.AND, List.of(c, d, e));
        Expression bOrNested = new CompositeCondition(LogicalOperator.OR, List.of(b, cAndDAndE));
        Expression finalExpr = new CompositeCondition(LogicalOperator.AND, List.of(a, bOrNested));

        // 直接求值
        System.out.println(finalExpr.evaluate()); // 输出 true
    }
}

4. 工具库推荐(省得自己写解析)

如果需要把字符串形式的表达式(比如"A && (B || (C && D))")转成可执行对象,不用自己写解析器,直接用现成库:

  • Apache Commons JEXL:支持解析类似Java语法的表达式,逻辑运算、嵌套都能搞定
  • MVEL:轻量级表达式语言,语法简洁,处理复杂逻辑表达式很顺手

举个JEXL的简单例子:

import org.apache.commons.jexl3.JexlEngine;
import org.apache.commons.jexl3.JexlExpression;

public class JexlExample {
    public static void main(String[] args) {
        JexlEngine jexl = new JexlEngine();
        String exprStr = "A && (B || (C && D && E))";
        JexlExpression expr = jexl.createExpression(exprStr);

        // 给表达式里的变量赋值
        var context = jexl.createContext();
        context.set("A", true);
        context.set("B", false);
        context.set("C", true);
        context.set("D", true);
        context.set("E", true);

        Boolean result = (Boolean) expr.evaluate(context);
        System.out.println(result); // 输出 true
    }
}

内容的提问来源于stack exchange,提问作者Mariza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:03:11