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

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

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

問(wèn)題描述

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

解決方案

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

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

具體代碼:

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

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

        // 創(chuàng)建一個(gè)腳本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 獲取一個(gè)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());
        }
    }
}

運(yùn)行結(jié)果

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

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

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

        // 創(chuàng)建一個(gè)腳本引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 獲取一個(gè)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());
        }
    }
}

運(yùn)行結(jié)果

注意:Java 9+ 已將 Nashorn 引擎標(biāo)記為廢棄(需手動(dòng)添加依賴(lài)),且存在安全風(fēng)險(xiǎn)。建議對(duì)非受信輸入進(jìn)行嚴(yán)格校驗(yàn)。

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

官網(wǎng)地址: exp4j

適用于數(shù)學(xué)表達(dá)式(安全且輕量級(jí)):

  1. 添加依賴(lài)(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)勢(shì)

  • 無(wú)外部依賴(lài),避免代碼注入風(fēng)險(xiǎn)
  • 支持自定義變量(如 "x^2 + y"
  • 支持?jǐn)?shù)學(xué)函數(shù)(sin, log 等)

方法3:使用Expression(Spring框架)(推薦)

適用于 Spring 項(xiàng)目:

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腳本引擎管理器是一個(gè)功能強(qiáng)大的工具,它能夠滿(mǎn)足我們?cè)贘ava代碼中執(zhí)行字符串公式的需求。通過(guò)ScriptEngineManager,我們可以輕松地獲取到各種腳本引擎(如JavaScript引擎),并利用這些引擎來(lái)解析和執(zhí)行嵌入在字符串中的數(shù)學(xué)表達(dá)式或其他類(lèi)型的腳本代碼。這種方法不僅簡(jiǎn)化了代碼的實(shí)現(xiàn),還提高了程序的靈活性和可擴(kuò)展性,使我們能夠高效地處理各種復(fù)雜的計(jì)算任務(wù)。

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

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

相關(guān)文章

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

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

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

    Java中File類(lèi)方法詳解以及實(shí)踐

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

    Spring Boot集成Spring Cloud Security進(jìn)行安全增強(qiáng)的方法

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

    SpringBoot 版本兼容性問(wèn)題解決

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

    Java中淺拷貝與深拷貝實(shí)例解析

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

    Oracle+Mybatis的foreach insert批量插入報(bào)錯(cuò)的快速解決辦法

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

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

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

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

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

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

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

    Spring?Boot日志的策略解析與門(mén)面模式

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

最新評(píng)論

新疆| 青河县| 恩平市| 垫江县| 安庆市| 香河县| 台南市| 定州市| 蒲城县| 垫江县| 临高县| 阿荣旗| 南昌县| 招远市| 蒙阴县| 西昌市| 凤城市| 宁国市| 舟山市| 门头沟区| 杭锦后旗| 滦平县| 南平市| 阿勒泰市| 峡江县| 淮北市| 赞皇县| 荔浦县| 新津县| 修水县| 喀喇| 长顺县| 密山市| 昂仁县| 中卫市| 尤溪县| 楚雄市| 葫芦岛市| 夏河县| 固安县| 团风县|