我需要存储像这样的布尔表达式:
x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6)
每个
x
变量都是一个布尔表达式,例如==
或!=
,具有值。问题是存储嵌套的AND
和OR
子句(在它们内部和/或相互内部)并用NOT
包装它们。包装深度可以非常深。Java SDK是否有用于这些表达式的数据结构?
我需要存储像这样的布尔表达式:
x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6)
x
变量都是一个布尔表达式,例如==
或!=
,具有值。问题是存储嵌套的AND
和OR
子句(在它们内部和/或相互内部)并用NOT
包装它们。包装深度可以非常深。Predicate<T>
是正确的选择。public static Predicate<Integer> equals(Integer compare) {
return i -> i.equals(compare);
}
public static Predicate<Integer> complex() {
return equals(1).and(equals(2)).and(equals(3)).or(equals(4).and(equals(5))).and(equals(6).negate());
}
JexlEngine jexl = new JexlEngine();
jexl.setSilent(true);
jexl.setLenient(true);
Expression expression = jexl.createExpression("(a || b && (c && d))");
JexlContext jexlContext = new MapContext();
//b and c and d should pass
jexlContext.set("b",true);
jexlContext.set("c",true);
jexlContext.set("d",true);
assertTrue((Boolean)expression.evaluate(jexlContext));
jexlContext = new MapContext();
//b and c and NOT d should be false
jexlContext.set("b",true);
jexlContext.set("c",true);
//note this works without setting d to false on the context
//because null evaluates to false
assertFalse((Boolean)expression.evaluate(jexlContext));
来自这个问题的示例
附注:它不包含在标准 SDK 中,但非常容易使用。
abstract class Predicate {...}
class AndPredicate extends Predicate {
private Predicate[] conjuncts;
...
}
class OrPredicate extends Predicate {
private Predicate[] disjuncts;
...
}
class NotPredicate extends Predicate {
Predicate negated;
...
}
问题是什么?