Что вам нужно - это движок/библиотека, которая может оценивать выражения, определяемые как строка во время выполнения. Если вы поместите оценочный код в вызов функции (например, лямбда-функцию), вы получите то, что вам нужно.
Вариант 1: Вы можете использовать exp4j. exp4j - небольшая библиотека, позволяющая оценивать выражения и функции во время выполнения. Вот пример:
Expression e = new ExpressionBuilder("3 * sin(y) - 2/(x - 2)")
.variables("x", "y")
.build()
.setVariable("x", 2.3)
.setVariable("y", 3.14);
double result = e.evaluate();
Вариант 2: Вы можете использовать Java's script engine. Вы можете использовать его для вычисления выражений, определенных, например, в JavaScript:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("sin(1.25)");
Вариант 3: Compile в родную Java. При таком подходе вы используете шаблон для генерации .java-файла с классом, который содержит ваше выражение. Затем вы вызываете компилятор Java. Этот подход имеет недостаток, который имеет некоторую сложность в реализации и некоторую начальную задержку (до компиляции класса), но производительность является лучшей. Вот некоторые ссылки для изучения:
нотой Внимание Какой бы подход вы выбрали, иметь в виду, что вы должны думать о безопасности. Разрешение пользователю вводить код, который может быть оценен без ограничений безопасности, может быть очень опасным.
Вы можете расширить вариант 3 с помощью генерации байт-кода - либо время компиляции (с некоторым плагином для сборки), либо во время выполнения. –
Большое вам спасибо за помощь. Можете ли вы разместить ссылку на то, как я могу использовать третий вариант. Это кажется довольно интересным. – odermark
@odermark, добавил ссылки на ответ. Я думаю, что первое должно дать вам хорошее начало. –