今天在公司项目中,发现一个计算运费的妙招。由于运费规则各种各样,因此写一个公式存到数据库。下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了。

一、先看几张图

(1)数据库存的公式
        
(2)怎么在java代码中计算出结果,见下面2张图
        
        这图,是在map集合中存了 key为"\\$w"  value为重量的参数。关键是下面这图
        
        这图中方法接收参数为 (公式,公式中变量的真实内容的Map集合)
    比较巧妙的地方是,它把这个公式字符串变成js形式的变量运算字符串;然后执行js脚本,这样就把结果算出来了。
    就相当于在java中,把"1+2" 这个字符串给算出结果来了。而且它这里还巧妙的使用了js的Math的一些方法。

二、来写个demo

        写个方法,实现传入公式和参数,计算出结果。直接上代码吧
package com.zxy.test;
import java.util.HashMap;
import java.util.Map;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.junit.Test; /**
* 如何将一个字符串公式,计算出结果
* @author ZENG.XIAO.YAN
* @date Oct 26, 2017 7:34:08 PM
* @version V1.0
*/ public class RunJsOnJava { @Test
public void test01() throws ScriptException {
String formula = "(a+b)*(a-b)";
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("a", 20.1);
map.put("b", 11.1);
Double result = (Double) this.calculateResultByFormula(formula, map);
System.out.println(result); //280.80000000000007
} /**
* 通过字符串公式,和参数,计算出结果
* @param formula
* @param paramMap
* @return
* @throws ScriptException
*/
public Object calculateResultByFormula (String formula,Map<String,Object> paramMap) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine scriptEngine = manager.getEngineByName("js");
for (String key : paramMap.keySet()) {
formula = formula.replaceAll(key, paramMap.get(key).toString());
}
        //此时 formula="(20.1+11.1)*(20.1-11.1)"
Object result = scriptEngine.eval(formula); // 运行js脚本
return result;
}
}
x
 
1
package com.zxy.test;
2
import java.util.HashMap;
3
import java.util.Map;
4
import javax.script.ScriptEngine;
5
import javax.script.ScriptEngineManager;
6
import javax.script.ScriptException;
7
import org.junit.Test;
8

9
/**     
10
 * 如何将一个字符串公式,计算出结果
11
 * @author  ZENG.XIAO.YAN    
12
 * @date    Oct 26, 2017 7:34:08 PM  
13
 * @version V1.0    
14
 */
15

16
public class RunJsOnJava {
17
    
18
    @Test
19
    public void test01() throws ScriptException {
20
        String formula = "(a+b)*(a-b)"; 
21
        HashMap<String,Object> map = new HashMap<String,Object>();
22
        map.put("a", 20.1);
23
        map.put("b", 11.1);
24
        Double result =  (Double) this.calculateResultByFormula(formula, map);
25
        System.out.println(result);  //280.80000000000007
26
    }
27
    
28
    /**
29
     * 通过字符串公式,和参数,计算出结果
30
     * @param formula
31
     * @param paramMap
32
     * @return
33
     * @throws ScriptException 
34
     */
35
    public Object calculateResultByFormula (String formula,Map<String,Object> paramMap) throws ScriptException {
36
        ScriptEngineManager manager = new ScriptEngineManager();
37
        ScriptEngine scriptEngine = manager.getEngineByName("js");
38
        for (String key : paramMap.keySet()) {
39
            formula = formula.replaceAll(key, paramMap.get(key).toString());
40
        }
41
        //此时 formula="(20.1+11.1)*(20.1-11.1)"
42
        Object result = scriptEngine.eval(formula); // 运行js脚本
43
        return result;
44
    }
45
}

三、小结

        通过百度,发现通过ScriptEngineManager相关api可以在java运行各种脚本。这种运行js脚本的方式,我们可以用来处理一些计算规则灵活多变的业务。就比如本项目中计算运费的模块,由于运费计算规则比较多变,所以就采用这种方式实现。
 
 
 

 

在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果的更多相关文章

  1. Java8中执行js脚本

    代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...

  2. 自动化测试中执行JS脚本方法封装

    执行JS脚本方法封装: class JavaScript(Base): def execute_javascript(self, js): """执行 JavaScrip ...

  3. java中执行JS脚本

    package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...

  4. Java代码中执行Linux命令,亲测可用

    前提需要知道怎么在linux怎么新建java文件和怎么编译,否则请先学其他知识!! import java.io.*;public class Test{ public static void mai ...

  5. java util - 在java代码中执行javascript代码工具 rhino-1.7.7.jar

    需要 rhino-1.7.7.jar 包 代码示例: package cn.java.mozilla.javascript; import org.mozilla.javascript.Context ...

  6. Java通过ScriptEngine 执行js脚本案例

    public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodEx ...

  7. java代码中执行liunx命令

    public static String runShell(String command){ try{ String[] commands = isLinux()?new String[]{" ...

  8. 在.Net中执行js

    在.Net中执行js 利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数.这个组件的获得方式:在NuGet中输入搜索"Noesis& ...

  9. java中执行js代码

    要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

随机推荐

  1. dcloud资源升级方式更新app

    var wgtVer = null; plus.runtime.getProperty(plus.runtime.appid, function(inf) { wgtVer = inf.version ...

  2. Android应用程序启动过程(一)总结

    一.App启动方式 1,冷启动 冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用. 冷启动的特点:因为系统会重新创建一个新的进程分配给它,所以会创建和初始化App ...

  3. 【three.js练习程序】拖动选中的物体

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. oracle 忘记了scott用户的密码,该怎么修改

    sqlplus / as sysdba,进入sys用户下,alter user scott identified by 123456,改成自己需要的密码

  5. mysql面试题目

    昨天晚上无意中翻译到baidu的 dba(mysql,redis) 面试题,阅读了一下,发现没有一个自己能完美解释的.这确实是温床导致的思维懒惰. 具体几个问题如下: 1:MySQL InnoDB存储 ...

  6. C# 添加日志 log4net

    1.首先在项目中添加Nuget程序包... 2.然后在NuGet窗体中搜索Log4Net,然后点击安装<安装过程可能会持续几分钟,请耐心等待> 3.在项目中添加一个Config文件,如已有 ...

  7. Huawei华为交换机 consolep密码和vty密码配置telnet,ssh

    以登录用户界面的认证方式为密码认证,密码为Huawei@123为例,配置如下. <HUAWEI> system-view [HUAWEI] user- [HUAWEI-ui-console ...

  8. 使用Vagrant和VirtualBox一步步地创建一个Base Box

    box集合  http://www.vagrantbox.es/ Vagrant和VirtualBox软件的安装步骤省略,去官网下载最新的版本然后下一步下一步地安装就行了,和正常的安装软件没有什么区别 ...

  9. 点击一个div ,把div里的某个参数的值,传到一个input里面

    ​​​

  10. java调用Linux执行Python爬虫,并将数据存储到elasticsearch--(环境脚本搭建)

    java调用Linux执行Python爬虫,并将数据存储到elasticsearch中 一.以下博客代码使用的开发工具及环境如下: 1.idea: 2.jdk:1.8 3.elasticsearch: ...