Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public static Object xy(final Object x, final Object y, final String expression) throws CompilationFailedException {
Binding b = new Binding();
b.setVariable("x", x);
b.setVariable("y", y);
GroovyShell sh = new GroovyShell(b);
return sh.evaluate(expression);
}val template = groovy.text.GStringTemplateEngine().createTemplate(expr)
fun groovyEvaluate(a: Double, b: Double, c: Double): Boolean {
val binding = HashMap<String, Double>()
binding.put("a", a)
binding.put("b", b)
binding.put("c", c)
val template = template.make(binding)
return template.toString().toBoolean()
}
Хочу обратить внимание, что через ScriptEngineManager можно запускать и целый Котлин (смотреть про kotlin-scripts-utils). Работает шустро, но долго компилируется перед запуском — для случайных выражений долго, а для более-менее постоянных скриптов может быть и интересно.
JexlEngine jexl = new JexlBuilder().create();
String jexlExp = "a>10 && b<c+5 && (a+b)<c*4";
JexlExpression e = jexl.createExpression(jexlExp);
JexlContext jc = new MapContext();
jc.set("a", 1);
jc.set("b", 2L);
jc.set("c", 3D);
Object o = e.evaluate(jc);
System.out.println("result: " + o);
Вычисление логических выражений в строке внутри Java/Scala/Kotlin кода