我有很多具有不同指标的对象。我正在根据用户输入构建公式。
class Object{
double metrics1;
double metrics2;
.. double metricsN; //number of metrics is knowned
}
用户可以输入
formula=metrics1
或
formula=(metrics1+metrics2)/metrics3
我已经有一个解析器来解析公式,但是我不知道如何存储这个表达式以供进一步计算。
我想避免一次又一次地为每个对象解析公式(我最多可以有几十万个)。
答案 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
}