【问题标题】:Condition String Resolver in java API? [closed]java API中的条件字符串解析器? [关闭]
【发布时间】:2013-12-27 07:55:22
【问题描述】:

我想解析以下条件字符串。因为我想在我的项目中支持动态条件。

a != 0 && b > 5

我期望的程序是

public boolean resolve() {
    String condition = "a != 0 && b > 5";
    Map<String, Object> paramMap = new HashMap<String, Object>;
    paramMap.put("a", 2);
    paramMap.put("b", 6);
    boolean result = ConditionResolver.resolve(condition, paramMap);
    if(result) {
        //do something
    }
} 

更新:

我不想解决数学方程式,如下所示

((a + b) * y) /x

【问题讨论】:

  • 为什么不使用表达式库?
  • @Prateek,我想用,但我不知道哪个 API 支持那个简单的条件
  • 请参考我的回答,或许对你有帮助
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 不一定是重复的,问题是关于逻辑表达式而不是数学表达式
  • @NarendraPathai 是的。同意

标签: java


【解决方案1】:

从 java 1.6 开始,您可以使用 ScriptEngine 并评估 javascript 如果这对您来说足够了和/或如果您不想引入另一个库。

ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
SimpleBindings bindings = new SimpleBindings();

bindings.put("a", 0);
bindings.put("b", 6);

boolean firstEval =  (Boolean) scriptEngine.eval("a != 0 && b > 5", bindings);
System.out.println(firstEval);

bindings.put("a", 2);
bindings.put("b", 6);

boolean secondEval =  (Boolean) scriptEngine.eval("a != 0 && b > 5", bindings);
System.out.println(secondEval);

输出

false
true

【讨论】:

  • 有没有java本地程序而不是引用其他语言可以处理逻辑计算的能力?
  • @Rene Link,您的程序可以满足我目前的要求。感谢您的提供。
【解决方案2】:

我认为你应该使用表达式库。也许这篇文章会对你有所帮助Built-in method for evaluating math expressions in Java

要评估逻辑表达式,请参考以下库:JANINO

示例

import java.lang.reflect.InvocationTargetException;

import org.codehaus.commons.compiler.CompileException;
import org.codehaus.janino.ExpressionEvaluator;

public class WorkSheet_1{
    public static void main(String[] args) throws CompileException, InvocationTargetException {
        ExpressionEvaluator ee = new ExpressionEvaluator(
                "a != 0 && b > 5",                     
                boolean.class,                           
                new String[] { "a", "b" },           
                new Class[] { int.class, int.class } 
            );

        Boolean res1 = (Boolean) ee.evaluate(new Object[] {new Integer(2), new Integer(6),});
        System.out.println("res1 = " + res1);
        Boolean res2 = (Boolean) ee.evaluate(new Object[] {new Integer(2), new Integer(5),});
        System.out.println("res2 = " + res2);
    }
}

输出

res1 = true
res2 = false

【讨论】:

  • 我认为,它只是解析数学表达式。可以解条件字符串吗?
  • Java 条件字符串不同于数学表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2021-05-03
  • 2012-11-12
  • 2014-01-04
相关资源
最近更新 更多