最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java執(zhí)行字符串公式的三種方法總結(jié)

 更新時間:2025年07月25日 10:34:40   作者:土豆絲~  
Java是一種廣泛應(yīng)用的編程語言,字符串邏輯運算是Java編程中一個非常重要的方面,這篇文章主要介紹了java執(zhí)行字符串公式的三種方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

問題描述

最近,在項目中遇到了一項特定需求:前端用戶需要輸入一個數(shù)學公式,這個公式隨后被保存到后臺數(shù)據(jù)庫中。當后臺需要從數(shù)據(jù)庫中檢索這個公式并進行計算時,面臨的一個挑戰(zhàn)是,從數(shù)據(jù)庫獲取的公式是以字符串形式存在的,無法直接代入數(shù)值進行計算。

解決方案

方法1:使用 ScriptEngine(Java內(nèi)置)

經(jīng)查閱資料,發(fā)現(xiàn)利用Java的腳本引擎(特別是JavaScript引擎)能夠高效地解析并執(zhí)行各類數(shù)學公式。在JDK 1.6及更高版本中,引入了javax.script包,這一包為開發(fā)者提供了極大的便利,能夠輕松地將腳本引擎嵌入到Java應(yīng)用程序中。借助這一功能,我們可以無縫地處理字符串形式的公式,并將其轉(zhuǎn)化為可執(zhí)行的代碼,從而滿足項目中的計算需求。

具體代碼:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class EvaluateExpression {
    public static void main(String[] args) {
        // 示例公式字符串(從數(shù)據(jù)庫中獲取)
        String expression = "3 + 5 * (2 - 8)";

        // 創(chuàng)建一個腳本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 獲取一個JavaScript引擎
        ScriptEngine engine = manager.getEngineByName("JavaScript");

        try {
            // 執(zhí)行公式并獲取結(jié)果
            Object result = engine.eval(expression);
            // 將結(jié)果轉(zhuǎn)換為字符串并打印
            System.out.println("公式" + expression + "的執(zhí)行結(jié)果是:"+ result);
        } catch (ScriptException e) {
            // 捕獲并處理腳本異常
            System.err.println(e.getMessage());
        }
    }
}

運行結(jié)果

注:如果公式中包含變量作為運算的一部分,我們可以通過使用Java字符串的replace()或者replaceAll()方法,將這些變量替換為具體的數(shù)值,隨后再進行計算。以下是一個具體的代碼實現(xiàn)示例,用于說明這一過程:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class EvaluateExpression {
    public static void main(String[] args) {
        // 示例公式字符串(從數(shù)據(jù)庫中獲取)
        String expression = "3 + a * (2 - b) + a";

        // 創(chuàng)建一個腳本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 獲取一個JavaScript引擎
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        String a = "5", b = "8";
        try {
            // 執(zhí)行公式并獲取結(jié)果
            Object result = engine.eval(expression.replaceAll("a", a).replace("b", b));
            // 將結(jié)果轉(zhuǎn)換為字符串并打印
            System.out.println("公式" + expression + "的執(zhí)行結(jié)果是:"+ result);
        } catch (ScriptException e) {
            // 捕獲并處理腳本異常
            System.err.println(e.getMessage());
        }
    }
}

運行結(jié)果

注意:Java 9+ 已將 Nashorn 引擎標記為廢棄(需手動添加依賴),且存在安全風險。建議對非受信輸入進行嚴格校驗。

方法2:使用第三方庫 [exp4j](推薦)

官網(wǎng)地址: exp4j

適用于數(shù)學表達式(安全且輕量級):

  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
       }
   }

優(yōu)勢

  • 無外部依賴,避免代碼注入風險
  • 支持自定義變量(如 "x^2 + y"
  • 支持數(shù)學函數(shù)(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
    }
}

總結(jié)

javax.script包中的ScriptEngineManager腳本引擎管理器是一個功能強大的工具,它能夠滿足我們在Java代碼中執(zhí)行字符串公式的需求。通過ScriptEngineManager,我們可以輕松地獲取到各種腳本引擎(如JavaScript引擎),并利用這些引擎來解析和執(zhí)行嵌入在字符串中的數(shù)學表達式或其他類型的腳本代碼。這種方法不僅簡化了代碼的實現(xiàn),還提高了程序的靈活性和可擴展性,使我們能夠高效地處理各種復(fù)雜的計算任務(wù)。

雖然ScriptEngine能滿足需求,但對Java 9+兼容性較差??紤]到目前大多數(shù)企業(yè)都采用Spring全家桶進行開發(fā),我們強烈推薦使用Spring Expression。當然exp4j也是很不錯的選擇。

到此這篇關(guān)于java執(zhí)行字符串公式的三種方法的文章就介紹到這了,更多相關(guān)java執(zhí)行字符串公式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用jar命令配置服務(wù)器端口的完整指南

    Java使用jar命令配置服務(wù)器端口的完整指南

    本文將詳細介紹如何使用java -jar命令啟動應(yīng)用,并重點講解如何配置服務(wù)器端口,同時提供一個實用的Web工具來簡化這一過程,希望對大家有所幫助
    2025-08-08
  • Java中File類方法詳解以及實踐

    Java中File類方法詳解以及實踐

    Java File類的功能非常強大,利用java基本上可以對文件進行所有操作,下面這篇文章主要給大家介紹了關(guān)于Java中File類方法以及實踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • Spring Boot集成Spring Cloud Security進行安全增強的方法

    Spring Boot集成Spring Cloud Security進行安全增強的方法

    Spring Cloud Security是Spring Security的擴展,它提供了對Spring Cloud體系中的服務(wù)認證和授權(quán)的支持,包括OAuth2、JWT等,這篇文章主要介紹了Spring Boot集成Spring Cloud Security進行安全增強,需要的朋友可以參考下
    2024-11-11
  • SpringBoot 版本兼容性問題解決

    SpringBoot 版本兼容性問題解決

    本文詳細介紹了SpringBoot版本兼容性問題的常見場景,包括與SpringFramework、依賴庫、JDK、SpringCloud及插件及工具的兼容性問題,幫助開發(fā)者避免兼容性問題,確保項目的穩(wěn)定性和可維護性
    2024-10-10
  • Java中淺拷貝與深拷貝實例解析

    Java中淺拷貝與深拷貝實例解析

    這篇文章主要給大家介紹了關(guān)于Java中淺拷貝與深拷貝的相關(guān)資料,拷貝對象是java中經(jīng)常會遇到的問題,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法

    Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法

    本文給大家介紹Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法,非常不錯,具有參考借鑒價值,感興趣的朋友參考下吧
    2016-08-08
  • SpringBoot中使用異步調(diào)度程序的高級方法

    SpringBoot中使用異步調(diào)度程序的高級方法

    本文主要介紹了SpringBoot中使用異步調(diào)度程序的高級方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • SpringBoot實現(xiàn)文件上傳功能

    SpringBoot實現(xiàn)文件上傳功能

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java多線程之Callable接口的實現(xiàn)

    Java多線程之Callable接口的實現(xiàn)

    這篇文章主要介紹了Java多線程之Callable接口的實現(xiàn),Callable和Runnbale一樣代表著任務(wù),區(qū)別在于Callable有返回值并且可以拋出異常。感興趣的小伙伴們可以參考一下
    2018-08-08
  • Spring?Boot日志的策略解析與門面模式

    Spring?Boot日志的策略解析與門面模式

    這篇文章主要介紹了Spring?Boot日志的策略解析與門面模式,日志對我們來說并不陌?,通過打印日志來發(fā)現(xiàn)和定位問題,或者根據(jù)日志來分析程序的運行過程,Spring?Boot中的日志管理是非常重要的,需要的朋友可以參考下
    2024-05-05

最新評論

台北市| 武邑县| 且末县| 万荣县| 固原市| 石台县| 霸州市| 武汉市| 锦屏县| 侯马市| 永定县| 内江市| 横峰县| 马龙县| 永定县| 石城县| 明溪县| 大埔区| 石阡县| 临高县| 青阳县| 潢川县| 漾濞| 焉耆| 枝江市| 岫岩| 盐津县| 新邵县| 通州市| 鄱阳县| 罗源县| 宁波市| 墨脱县| 什邡市| 西宁市| 南宫市| 简阳市| 理塘县| 双鸭山市| 天等县| 永昌县|