Как преобразовать строку с математическим выражением в часть выполняемого кода?

Возможно ли преобразовать строку с математическим выражением в часть кода следующим образом:
Существует переменная типа String, которая инициализирована следующим: x*x*x.
В коде есть некоторый метод, который работал бы следующим образом:

public double someMethod(double x)
{
return (число, полученное вычислением выражения, которое содержится в вышеуказанной переменной);
}

Если такое возможно, как это можно реализовать?


Ответы (1 шт):

Автор решения: Alex Rudenko

В Java 8..11 Можно использовать JavaScript-движок Nashorn, впрочем он был помечен как deprecated в Java 11 и окончательно удалён в Java 15.

Данный движок поддерживает знаменитую функцию eval, выполняющую JavaScript на Java, тогда требуемый метод может выглядеть так:

public static double foo(double x) {
    String script =  "var x = " + x + ";";
    String fun = "x * x * x";
    try {
        return (double) engine.eval(script + fun);
    } catch (ScriptException screx) { // convert checked exception to Runtime
        throw new RuntimeException(screx);
    }
}

Или даже можно определить функцию в джаваскрипте и подставить в её вызов значение x:

public static double bar(double x) {
    String script = "function f(x) { return x * x * x} f(" + x + ");";
    try {
        return (double) engine.eval(script);
    } catch (ScriptException screx) {
        throw new RuntimeException(screx);
    }
}

Результаты:

System.out.println("foo(3) = " + foo(3)); // foo(3) = 27.0
System.out.println("bar(2) = " + bar(2)); // bar(2) = 8.0
→ Ссылка