在开发中我们可能会出现大量的公式计算,而这些公式可能并不确定。

比如用户今天说a=b+c 然而下次说公式不正确 应该是a=d+e

如果单纯的在代码中把这些公式写死 实现,后期修改维护工作量显然会增加好多。

下面就简单的介绍一种实现方法的思路:

我们知道js的eval()方法可以执行字符串的代码 而恰好jdk6增加了对脚本语言的支持 我们可以利用这个特性对计算实现简单化的处理

下面举个例子

例如有个公式  A+B*C  其中A=1,B=2,C=3

我们可以将公式的A B C替换成数字 转换为 1+2*3 最后就可以得到结果了

刚刚接触到ScriptEngine这个东西的时候仅仅了解其eval()方法 ,于是我利用了上述例子的思路去实现将字母替换成相应的数字去得到数字公式进而得到运算结果。

那么替换的方法当然是用正则去替换了,java中String对象有个replaceAll()方法可以实现。

当时想这个正则可是琢么了一会儿呢。然而我这种实现却白忙活了,因为后期发现没有必要这么麻烦

具体怎么实现大家可以想想看,我就不具体介绍了,有了思路比什么都重要。

然而过了一段时间,我在面试的时候和一个前辈聊天时,前辈告诉我不用自己写正则去替换,js中本来就有对象,也支持对象的运算,所以直接往里放对象就可以。

后来我自己查了查资料,发现果然可以:

为了可以实现打印出中间参与计算的变量,我利用反射实现了获取值的方法

下面就是代码的实现:

public static void Calculation(){
        Student stu=new Student();
        stu.setAge(10);
        stu.setName("zhangsan");
        stu.setSex(false);

// 上边是student对象

Class claz=stu.getClass();
        String className= claz.getSimpleName();
        //String formula="Student.name+Student.age+10";  //1
        String formula="function test(){ if(Student.age==10){ return 12;} }"; //2
        System.out.println("the formula is:"+formula);

//获取对象名称和值
        for(Field field: claz.getDeclaredFields()){
            try {
                //打开私有访问
                //field.setAccessible(true);
                String fieldName = field.getName();
                Method m = (Method) claz.getMethod("get" +getMethodName(fieldName));  
                System.out.println(getMethodName(fieldName));
                System.out.println(field.getGenericType()+"-"+"fieldName:"+fieldName+"="+m.invoke(stu));
            } catch (Exception e) {
                e.printStackTrace();
            } 
        }
        Object result=null;  //计算结果
        ScriptEngineManager manager = new ScriptEngineManager();   //创建一个ScriptEngineManager对象
        ScriptEngine engine = manager.getEngineByName("js");  //通过ScriptEngineManager获得ScriptEngine对象
        engine.put(className, stu);  //将student对象放到ScriptEngine 中为计算变量提供值
        
        try {
            //result =engine.eval(formula);  //1 用ScriptEngine的eval方法执行脚本  String formula="Student.name+Student.age+10";

engine.eval(formula);            //2
            Invocable inv = (Invocable) engine; //2
            result=inv.invokeFunction("test");  //2   执行字符串 js test()
            System.out.println("the result is :"+result.toString());
        } catch (Exception e) {
            System.out.println("错误");
            e.printStackTrace();
        } 
    }
    
     // 把一个字符串的第一个字母大写 
     private static String getMethodName(String fildeName) throws Exception{  
             byte[] items = fildeName.getBytes();  
             items[0] = (byte) ((char) items[0] - 'a' + 'A');  
             return new String(items);  
     }

上述代码 还可注释2 打开注释1 试试 一样可以的 不过方式不同而已

有了这个思想 我们就可以把公式维护到数据库或文件中 方便我们后期对公式的维护修改 这样利用这个工具应该可以减少计算代码编写的复杂度

后期我也发现了好多表达式引擎如:Aviator、IKExpression等。

利用ScriptEngineManager实现字符串公式灵活计算相关推荐

  1. php 字符串进行计算_怎么在php中利用eval对字符串格式进行计算

    怎么在php中利用eval对字符串格式进行计算 发布时间:2020-12-16 16:42:57 来源:亿速云 阅读:101 作者:Leah 本篇文章给大家分享的是有关怎么在php中利用eval对字符 ...

  2. ABAP 对字符串公式进行计算

    函数:EVAL_FORMULA 参考代码: DATA:formula TYPE string,      l_value TYPE f,      l_dmbtr TYPE mseg-dmbtr. f ...

  3. php字符串转换表达式,php处理字符串格式的计算表达式

    有时候我们对每一种产品都有一个提成公式,而这个计算提成的公式是以字符串格式存在表中的 当我们用这个计算公式时,他并不像我们写的:$a=2+3*5;这样简单的能计算出结果,而它是个字符串 所以,我们就必 ...

  4. 利用Java的BigDecimal与马青公式精确计算π后10000位,

    首先给出公式如下: π=16arctan1/5−4arctan1/239: 即是 π=16×(1/(1×5)−1/(3×5的3次方)+1/(5×5的5次方)-)−4×(1/(1×239)−1/(3×2 ...

  5. C#之字符串公式计算

    一.背景 小伙伴们在C#开发时,如果变量formula是一个字符串公式,但是又想对其进行计算,如何实现呢?这里推荐一种比较好的方法. 二.思路 可以用.NET自带的DataTable().Comput ...

  6. 在Excel表格中插入函数,利用公式进行计算

    https://jingyan.baidu.com/article/f54ae2fc210fa11e92b849e9.html 我们以一个简单的工资表为例,来说明这些公式. 首先新建一个表格,按需要确 ...

  7. [足式机器人]Part2 高等机构学Ch0X-2 空间闭式运动链的自由度公式及计算——【读书笔记】

    本文仅供学习使用 本文参考: <空间机构的分析与综合(上册)>-张启先,感谢张启先先生对机构学的卓越贡献,希望下册有见天明之日! <高等机构学>-白师贤 <高等空间机构学 ...

  8. python字符串可以使用+进行计算吗_python用正则对字符串进行运算

    importredefnul_div(source):"""处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算 :pa ...

  9. C#利用正则表达式实现字符串搜索

    摘要:本文给出了在C#下利用正则表达式实现字符串搜索功能的方法,通过对.NET框架下的正则表达式的研究及实例分析,总结了正则表达式的元字符.规则.选项等. 关键字:正则表达式.元字符.字符串.匹配 1 ...

最新文章

  1. 面试官:你知道Java中的回调机制吗?
  2. 鸿蒙os不需要wifi,【鸿蒙HarmonyOS HiSpark IPC DIY Camera】hi3518-wifi的配置与使用
  3. 从源码带你看懂functools的partial方法
  4. 彻底弄懂ICG的基本概念
  5. 每个人的宿命都是从文本走向二进制,你也不例外 !
  6. .NET开发不可错过的25款必备工具
  7. 阿里安全猎户座实验室(Alibaba Orion Security Lab)简介
  8. shell比较运算符
  9. ubuntu要更新18.04了,lei了lei了~~~
  10. 某中学要对学校运动会进行计算机管理,2020年新编高职入学考试适应性试卷信息技术试卷定稿名师精品资料....
  11. Python 线程队列 Queue – FIFO - Python零基础入门教程
  12. python怎么打开excel文件并处理_Python利用openpyxl处理Excel文件(Excel文件基本操作)...
  13. 解决微信浏览器无法使用reload()刷新页面
  14. 【面试题】能从底层角度聊聊volatile关键字的原理吗?
  15. 人工神经网络的训练步骤,神经网络训练过程图解
  16. Windows 10文件浏览器多标签浏览插件
  17. Java8~9章 复习(三)
  18. Flex移动皮肤-第一部分:增强的皮肤功能基础
  19. Python垃圾收集机制
  20. 管理者应该会讲的68个超级经典小故事

热门文章

  1. 深入探索 IBM 数据分析和预测软件 - PASW Modeler
  2. 【转载+思考】追问泄题之源:命题权寻租打开方便之门
  3. 使用高速通道加速iOS版本审核
  4. PyQt4日历部件QXalendarWidget
  5. jQuery Easy UI Panel(面板)组件
  6. 织梦轻量级mvc框架笔记
  7. MDaemon12.X特殊注意事项和新功能
  8. MySQL常用命令用法总结
  9. android单选控件spinner与数据库结合综合实例
  10. 关于返回二维数组排序后序号数组的问题求解