我需要存储这样的布尔表达式:
x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6)
每个x
变量都是带有值的==
或!=
的布尔表达式。问题是存储嵌套的AND
和OR
子句(在自身内部和/或彼此内部)并用NOT
包装它们。包裹深度可以非常深。
Java SDK是否具有这些表达式的数据结构?
答案 0 :(得分:2)
在Java 8中,功能接口Predicate<T>
是可行的方法。
以下是Java docs。
这里有各种examples。
因此,在您的用例中,它将如下所示:
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());
}
记住 - 只有Java 8以上版本!
答案 1 :(得分:0)
您可以尝试使用jexl(http://commons.apache.org/jexl/)
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));
的示例
ps:它不包含在标准sdk中,但很容易使用。
答案 2 :(得分:0)
abstract class Predicate {...}
class AndPredicate extends Predicate {
private Predicate[] conjuncts;
...
}
class OrPredicate extends Predicate {
private Predicate[] disjuncts;
...
}
class NotPredicate extends Predicate {
Predicate negated;
...
}
有什么问题?