是否存在用于存储布尔表达式的数据结构?

时间:2016-06-29 09:46:26

标签: java

我需要存储这样的布尔表达式:

x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6)

每个x变量都是带有值的==!=的布尔表达式。问题是存储嵌套的ANDOR子句(在自身内部和/或彼此内部)并用NOT包装它们。包裹深度可以非常深。

Java SDK是否具有这些表达式的数据结构?

3 个答案:

答案 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));

来自this question

的示例

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;
  ...
}

有什么问题?