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执行字符串公式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot3如何集成Hazelcast

    SpringBoot3如何集成Hazelcast

    Hazelcast是一款优秀的开源内存数据网格平台,它能够提供分布式数据存储和缓存解决方案,通过与SpringBoot3的整合,开发者可以轻松实现分布式缓存、数据共享和会话管理等功能,Hazelcast的内存数据网格特性支持高性能的缓存系统,能够减少数据库访问次数,提升应用性能
    2024-10-10
  • 详细讲述Java中的对象转型

    详细讲述Java中的对象转型

    在本篇文章里我们给大家详细分享了关于Java中的对象转型的知识点内容,有兴趣的朋友们学习下。
    2018-10-10
  • InvocationHandler中invoke()方法的调用问题分析

    InvocationHandler中invoke()方法的调用问题分析

    这篇文章主要介绍了InvocationHandler中invoke()方法的调用问题分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中数组的定义和使用教程(二)

    Java中数组的定义和使用教程(二)

    这篇文章主要给大家介绍了关于Java中数组的定义和使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 剑指Offer之Java算法习题精讲数组查找与字符串交集

    剑指Offer之Java算法习题精讲数组查找与字符串交集

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Java关键字this使用方法详细讲解(通俗易懂)

    Java关键字this使用方法详细讲解(通俗易懂)

    这篇文章主要介绍了Java关键字this使用方法的相关资料,Java关键字this主要用于在方法体内引用当前对象,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • Java实现一键生成表controller,service,mapper文件

    Java实现一键生成表controller,service,mapper文件

    这篇文章主要为大家详细介绍了如何利用Java语言实现一键生成表controller,service,mapper文件,文中的示例代码讲解详细,需要的可以收藏一下
    2023-05-05
  • SpringMVC RESTFul及REST架构风格介绍

    SpringMVC RESTFul及REST架构风格介绍

    这篇文章主要为大家介绍了SpringMVC RESTFul及REST架构风格介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • SpringBoot Redis清除所有的key的实现方法

    SpringBoot Redis清除所有的key的实现方法

    本文主要介绍了SpringBoot Redis清除所有的key的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 浅谈Java中的克隆close()和赋值引用的区别

    浅谈Java中的克隆close()和赋值引用的区别

    下面小编就为大家带来一篇浅谈Java中的克隆close()和赋值引用的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论