package com.test.nashornJavaScript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.math.BigDecimal;
/**
* java8新特性之七Nashorn JavaScript 出处:https://blog.youkuaiyun.com/wen901230zi/article/details/105388973
* @auther zhangZhi
* @create 2022-05-05 22:41
*/
public class NashornJavaScriptTest {
public static void main(String[] args) {
ScriptEngineManager scriptEngineManager=new ScriptEngineManager();
ScriptEngine scriptEngine=scriptEngineManager.getEngineByName("nashorn");
String name="测试JVM中javasScript eval()函数计算:";
Object result =null;
try {
scriptEngine.eval("print('" + name + "')");
result = scriptEngine.eval("5*3/(2+10)");
System.out.println("方式1:" + result);
result = scriptEngine.eval("x=10; y=20;(x*y);");
System.out.println("方式2:" + result);
result = scriptEngine.eval("A=1,B=2,C=3,A+B*C ");
System.out.println("方式3:" + result);
//方式4:项目中实际公式计算验证
String a = "1.753";
String b = "2.53";
String c = "3.5455";
String d = "4";
String x = "5";
String formula = "AX³+BX²+C*X+D";
String replaceFormula = formula;
replaceFormula = replaceFormula.replaceAll("X²","*X*X");
replaceFormula = replaceFormula.replaceAll("X³","*X*X*X");
replaceFormula = replaceStr(replaceFormula,"A", a);
replaceFormula = replaceStr(replaceFormula,"B", b);
replaceFormula = replaceStr(replaceFormula,"C", c);
replaceFormula = replaceStr(replaceFormula,"D", d);
replaceFormula = replaceStr(replaceFormula,"X", x);
result = scriptEngine.eval(replaceFormula);
if(null != result){
BigDecimal bd = new BigDecimal(result.toString());
bd = bd.stripTrailingZeros();
result = bd.toPlainString();
}
System.out.println("方式4,原公式函数:" + formula + "\n转换后:" + replaceFormula + "\n计算结果:"+ result.toString());
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行脚本错误: "+ e.getMessage());
}
}
/**
* 精确替换字符 防止出现 匹配A 时将AA匹配的情况
*/
public static String replaceStr(String sourceStr,String replaceKey,String replaceValue){
String replaceStrReg="";
for(char str_char:replaceKey.toCharArray()){
replaceStrReg+="[";
replaceStrReg+=str_char;
replaceStrReg+="]";
}
String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])";
String endReg="([\\+\\-\\*/,(])"+replaceStrReg+"$";
String reg="([^a-zA-Z])("+replaceStrReg+")"+"([^a-zA-Z])";
String endStr=sourceStr;
while(matcheStr(endStr,replaceKey)){
endStr=endStr.replaceAll(startReg, replaceValue+"$1");
endStr=endStr.replaceAll(reg, "$1"+replaceValue+"$3");
endStr=endStr.replaceAll(endReg, "$1"+replaceValue);
}
return endStr;
}
/**
* 精确匹配字符 防止出现 匹配A 时将AA匹配的情况
*/
public static Boolean matcheStr(String sourceStr,String matchStr){
String replaceStrReg="";
for(char str_char:matchStr.toCharArray()){
replaceStrReg+="[";
replaceStrReg+=str_char;
replaceStrReg+="]";
}
String startReg="^"+replaceStrReg+"([\\+\\-\\*/,)])[\\s\\S]*";
String endReg="[\\s\\S]*([\\+\\-\\*/,(])"+replaceStrReg+"$";
String reg="[\\s\\S]*([^A-Za-z])("+replaceStrReg+")"+"([^A-Za-z])[\\s\\S]*";
if(sourceStr.matches(startReg)||sourceStr.matches(reg)||sourceStr.matches(endReg)){
return true;
}else{
return false;
}
}
}
jdk1.8新特性之Nashorn JavaScript扩展
最新推荐文章于 2024-02-27 13:53:59 发布
本文介绍了如何在Java8中使用NashornJavaScript引擎执行脚本,展示了`eval()`函数的用法以及如何处理字符串替换以进行复杂的数学计算。
1万+

被折叠的 条评论
为什么被折叠?



