java执行字符串公式的三种方法总结

 更新时间:2025年07月25日 10:34:40   作者:土豆丝~  
Java是一种广泛应用的编程语言,字符串逻辑运算是Java编程中一个非常重要的方面,这篇文章主要介绍了java执行字符串公式的三种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

问题描述

最近,在项目中遇到了一项特定需求:前端用户需要输入一个数学公式,这个公式随后被保存到后台数据库中。当后台需要从数据库中检索这个公式并进行计算时,面临的一个挑战是,从数据库获取的公式是以字符串形式存在的,无法直接代入数值进行计算。

解决方案

方法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

适用于数学表达式(安全且轻量级):

  1. 添加依赖(Maven):
<dependency>
    <groupId>net.objecthunter</groupId>
    <artifactId>exp4j</artifactId>
    <version>0.4.8</version>
</dependency>
  1. 示例代码
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执行字符串公式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用jar命令配置服务器端口的完整指南

    Java使用jar命令配置服务器端口的完整指南

    本文将详细介绍如何使用java -jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助
    2025-08-08
  • Java中File类方法详解以及实践

    Java中File类方法详解以及实践

    Java File类的功能非常强大,利用java基本上可以对文件进行所有操作,下面这篇文章主要给大家介绍了关于Java中File类方法以及实践的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Spring Boot集成Spring Cloud Security进行安全增强的方法

    Spring Boot集成Spring Cloud Security进行安全增强的方法

    Spring Cloud Security是Spring Security的扩展,它提供了对Spring Cloud体系中的服务认证和授权的支持,包括OAuth2、JWT等,这篇文章主要介绍了Spring Boot集成Spring Cloud Security进行安全增强,需要的朋友可以参考下
    2024-11-11
  • SpringBoot 版本兼容性问题解决

    SpringBoot 版本兼容性问题解决

    本文详细介绍了SpringBoot版本兼容性问题的常见场景,包括与SpringFramework、依赖库、JDK、SpringCloud及插件及工具的兼容性问题,帮助开发者避免兼容性问题,确保项目的稳定性和可维护性
    2024-10-10
  • Java中浅拷贝与深拷贝实例解析

    Java中浅拷贝与深拷贝实例解析

    这篇文章主要给大家介绍了关于Java中浅拷贝与深拷贝的相关资料,拷贝对象是java中经常会遇到的问题,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    本文给大家介绍Oracle+Mybatis的foreach insert批量插入报错的快速解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友参考下吧
    2016-08-08
  • SpringBoot中使用异步调度程序的高级方法

    SpringBoot中使用异步调度程序的高级方法

    本文主要介绍了SpringBoot中使用异步调度程序的高级方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • SpringBoot实现文件上传功能

    SpringBoot实现文件上传功能

    这篇文章主要为大家详细介绍了SpringBoot实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java多线程之Callable接口的实现

    Java多线程之Callable接口的实现

    这篇文章主要介绍了Java多线程之Callable接口的实现,Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常。感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Spring Boot日志的策略解析与门面模式

    Spring Boot日志的策略解析与门面模式

    这篇文章主要介绍了Spring Boot日志的策略解析与门面模式,日志对我们来说并不陌⽣,通过打印日志来发现和定位问题,或者根据日志来分析程序的运行过程,Spring Boot中的日志管理是非常重要的,需要的朋友可以参考下
    2024-05-05

最新评论