基于用户输入的动态公式

时间:2016-03-08 03:34:43

标签: java command-line

我有很多具有不同指标的对象。我正在根据用户输入构建公式。

    class Object{
     double metrics1;
     double metrics2;
     .. double metricsN;  //number of metrics is knowned
    }

用户可以输入

     formula=metrics1

     formula=(metrics1+metrics2)/metrics3

我已经有一个解析器来解析公式,但是我不知道如何存储这个表达式以供进一步计算

我想避免一次又一次地为每个对象解析公式(我最多可以有几十万个)

1 个答案:

答案 0 :(得分:0)

使用ScriptEngine和这样的反射。

static class Evaluator {
    ScriptEngine engine = new ScriptEngineManager()
        .getEngineByExtension("js");

    void formula(String formula) {
        try {
            engine.eval("function foo() { return " + formula + "; }");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    Object eval(Object values)
            throws ScriptException,
                IllegalArgumentException,
                IllegalAccessException {
        for (Field f : values.getClass().getFields())
            engine.put(f.getName(), f.get(values));
        return engine.eval("foo()");
    }

}

public static class Object1 {
    public double metrics1;
    public double metrics2;
    Object1(double metrics1, double metrics2) {
        this.metrics1 = metrics1;
        this.metrics2 = metrics2;
    }
}

public static void main(String[] args)
    throws ScriptException,
        IllegalArgumentException,
        IllegalAccessException {
    Evaluator e = new Evaluator();
    e.formula("metrics1 + metrics2");
    Object1 object = new Object1(1.0, 2.0);
    System.out.println(e.eval(object));
    // -> 3.0
}