问题描述
最近,在项目中遇到了一项特定需求:前端用户需要输入一个数学公式,这个公式随后被保存到后台数据库中。当后台需要从数据库中检索这个公式并进行计算时,面临的一个挑战是,从数据库获取的公式是以字符串形式存在的,无法直接代入数值进行计算。
解决方案
方法1:使用 scriptengine(java内置)
经查阅资料,发现利用java的脚本引擎(特别是javascript引擎)能够高效地解析并执行各类数学公式。在jdk 1.6及更高版本中,引入了javax.script包,这一包为开发者提供了极大的便利,能够轻松地将脚本引擎嵌入到java应用程序中。借助这一功能,我们可以无缝地处理字符串形式的公式,并将其转化为可执行的代码,从而满足项目中的计算需求。
具体代码:
import javax.script.scriptengine;
import javax.script.scriptenginemanager;
import javax.script.scriptexception;
public class evaluateexpression {
public static void main(string[] args) {
// 示例公式字符串(从数据库中获取)
string expression = "3 + 5 * (2 - 8)";
// 创建一个脚本引擎管理器
scriptenginemanager manager = new scriptenginemanager();
// 获取一个javascript引擎
scriptengine engine = manager.getenginebyname("javascript");
try {
// 执行公式并获取结果
object result = engine.eval(expression);
// 将结果转换为字符串并打印
system.out.println("公式" + expression + "的执行结果是:"+ result);
} catch (scriptexception e) {
// 捕获并处理脚本异常
system.err.println(e.getmessage());
}
}
}
运行结果

注:如果公式中包含变量作为运算的一部分,我们可以通过使用java字符串的replace()或者replaceall()方法,将这些变量替换为具体的数值,随后再进行计算。以下是一个具体的代码实现示例,用于说明这一过程:
import javax.script.scriptengine;
import javax.script.scriptenginemanager;
import javax.script.scriptexception;
public class evaluateexpression {
public static void main(string[] args) {
// 示例公式字符串(从数据库中获取)
string expression = "3 + a * (2 - b) + a";
// 创建一个脚本引擎管理器
scriptenginemanager manager = new scriptenginemanager();
// 获取一个javascript引擎
scriptengine engine = manager.getenginebyname("javascript");
string a = "5", b = "8";
try {
// 执行公式并获取结果
object result = engine.eval(expression.replaceall("a", a).replace("b", b));
// 将结果转换为字符串并打印
system.out.println("公式" + expression + "的执行结果是:"+ result);
} catch (scriptexception e) {
// 捕获并处理脚本异常
system.err.println(e.getmessage());
}
}
}
运行结果

注意:java 9+ 已将 nashorn 引擎标记为废弃(需手动添加依赖),且存在安全风险。建议对非受信输入进行严格校验。
方法2:使用第三方库 [exp4j](推荐)
官网地址: exp4j
适用于数学表达式(安全且轻量级):
- 添加依赖(maven):
<dependency>
<groupid>net.objecthunter</groupid>
<artifactid>exp4j</artifactid>
<version>0.4.8</version>
</dependency>
- 示例代码:
import net.objecthunter.exp4j.expression;
import net.objecthunter.exp4j.expressionbuilder;
public class formulacalculator {
public static void main(string[] args) {
string formula = "10 * (3 + 2) / 5";
expression expression = new expressionbuilder(formula).build();
double result = expression.evaluate();
system.out.println(result); // 输出: 10.0
}
}
优势:
- 无外部依赖,避免代码注入风险
- 支持自定义变量(如
"x^2 + y") - 支持数学函数(
sin,log等)
方法3:使用expression(spring框架)(推荐)
适用于 spring 项目:
import org.springframework.expression.expression;
import org.springframework.expression.expressionparser;
import org.springframework.expression.spel.standard.spelexpressionparser;
public class formulacalculator {
public static void main(string[] args) {
string formula = "10 * (3 + 2) / 5";
expressionparser parser = new spelexpressionparser();
expression exp = parser.parseexpression(formula);
integer result = exp.getvalue(integer.class);
system.out.println(result); // 输出: 10
}
}
总结
javax.script包中的scriptenginemanager脚本引擎管理器是一个功能强大的工具,它能够满足我们在java代码中执行字符串公式的需求。通过scriptenginemanager,我们可以轻松地获取到各种脚本引擎(如javascript引擎),并利用这些引擎来解析和执行嵌入在字符串中的数学表达式或其他类型的脚本代码。这种方法不仅简化了代码的实现,还提高了程序的灵活性和可扩展性,使我们能够高效地处理各种复杂的计算任务。
虽然scriptengine能满足需求,但对java 9+兼容性较差。考虑到目前大多数企业都采用spring全家桶进行开发,我们强烈推荐使用spring expression。当然exp4j也是很不错的选择。
到此这篇关于java执行字符串公式的三种方法的文章就介绍到这了,更多相关java执行字符串公式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论