V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
egzosn
V2EX  ›  问与答

史上最为高效的表达式计算引擎 Fel

  •  
  •   egzosn · 2021-03-01 13:46:40 +08:00 · 1247 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    花满天的季节

    盼望着,盼望着,三月悄然来了。

    一切都像刚睡醒的样子,犹如婴儿缓缓睁眼。

    粉粉嫩嫩的花儿开始羞涩起来,

    沉闷程序猿小哥哥开始躁动起来

    小 E 也带着小妹妹悠悠公园深处。

    桃花

    万物生长

    桃花 桃花运来了

    闷闷直男小 E,带着小妹妹压着公园马路看着桃花内心小小的烂漫,话虽不多不爱自拍,但小妹妹在不爱自拍也融于这美美桃花之中,尽可能的绣着恩爱。

    甜蜜中 甜蜜中

    突如其来 突如其来

    我的美梦就这样破碎了 破碎

    ヽ`、 、ヽ`、还没到三伏天的大雨ヽ`、ヽ、ヽ`ヽヽ、

    ヽ`、ヽ ヽ烦人逗比经理电话来了 、 ヽ`、ヽ、ヽ`、ヽ、ヽ`、

    ヽ、ヽ 、ヽ`、ヽ、ヽ`、ヽ

    对话

    对话

    对话

    对话

    对话

    Fel 是轻量级的高效的表达式计算引擎

    Fel 在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。

    Fel 是开放的,引擎执行中的多个模块都可以扩展或替换。Fel 的执行主要是通过函数实现,运算符(+、-等都是 Fel 函数),所有这些函数都是可以替换的,扩展函数也非常简单。
    
    Fel 有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成 java 代码和编译模块都是可以扩展和替换的)
    

    Fel 基于 Java1.5 开发,适用于 Java1.5 及以上版本。

    Fel 有多快?

    通常情况下,Fel-0.7 每秒可以执行千万次表达式(不包含编译时间)。速度是 Jexl-2.0 的 20 倍以上。
    目前还没有发现开源的表达式引擎比 Fel 快。
    

    为何要使用 Fel ?

    1. Fel 语法和 API 非常简单,语法与 Java 基本相同,几乎没有学习成本。
    2. Fel 非常快,上面已经做了简单说明。
    3. Fel 整个包只有 200 多 KB 。
    4. Fel 可以非常方便的访问数组、集合、Map 的元素和对象的属性。
    5. Fel 可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。
    6. Fel 支持大数值高精度计算
    7. Fel 有良好的安全管理功能
    8. 如果 Fel 不能满足你的要求,扩展和修改 Fel 很简单。

    Fel 适用场景

    1. Fel 只支持表达式,不支持脚本。
    2. Fel 适合处理海量数据,Fel 良好的扩展性可以更好的帮助用户处理数据。
    3. Fel 同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)

    如何使用

    项目虽然很久很久没有进行更新,但现有 BUG 甚少。最新版本为 0.9,但 maven 只到 0.8😭

    1. 项目主页: http://code.google.com/p/fast-el
    2. 下载地址: http://code.google.com/p/fast-el/downloads/list
    3. Maven
    <dependency>
       <groupId>org.eweb4j</groupId>
       <artifactId>fel</artifactId>
       <version>0.8</version>
    </dependency>
    

    Fel 使用例子

    算术表达式:

    FelEngine fel = new FelEngineImpl();
    Object result = fel.eval("5000*12+7500");
    System.out.println(result);
    输出结果:67500
    

    变量 使用变量,其代码如下所示:

    FelContext ctx = fel.getContext();
    ctx.set("单价", 5000);
    ctx.set("数量", 12);
    ctx.set("运费", 7500);
    Object result = fel.eval("单价*数量+运费");
    System.out.println(result);
    
    输出结果:67500
    
    访问对象属性:
    
    FelEngine fel = new FelEngineImpl(); 
    FelContext ctx = fel.getContext(); 
    Foo foo = new Foo(); 
    ctx.set("foo", foo); 
    Map<String,String> m = new HashMap<String,String>(); 
    m.put("ElName", "fel"); 
    ctx.set("m",m);
    //调用 foo.getSize()方法。
    Object result = fel.eval("foo.size"); 
    //调用 foo.isSample()方法。
    result = fel.eval("foo.sample");
    //foo 没有 name 、getName 、isName 方法
    //foo.name 会调用 foo.get("name")方法
    result = fel.eval("foo.name");
    //m.ElName 会调用 m.get("ElName");
    result = fel.eval("m.ElName");
    
    编译执行:
    
    FelEngine fel = new FelEngineImpl();
    FelContext ctx = fel.getContext();
    ctx.set("单价", 5000);
    ctx.set("数量", 12);
    ctx.set("运费", 7500);
    Expression exp = fel.compile("单价*数量+运费",ctx);
    Object result = exp.eval(ctx);
    
    System.out.println(result);
    
    
    执行结果:67500
    
    访问数组、集合、Map
    调用 JAVA 方法
    自定义上下文环境
    多层上下文环境(命名空间)
    自定义函数
    调用静态方法
    大数值计算(始于 0.9 版本)
    

    安全(始于 0.8 版本)

    为了防止出现“${'System'}.exit(1)”这样的表达式导致系统崩溃。Fel 加入了安全管理器,主要是对方法访问进行控制。安全管理器中通过允许访问的方法列表(白名单)和禁止访问的方法列表(黑名单)来控制方法访问。将"java.lang.System. *"加入到黑名单,表示 System 类的所有方法都不能访问。将"java.lang.Math. *"加入白名单,表示只能访问 Math 类中的方法。如果你不喜欢这个安全管理器,可以自己开发一个,非常简单,只需要实现一个方法就可以了。

    在此之前小 E 居然都不知道有这样强力的表达式计算引擎,就这样小 E 跟着逗比经理引导学习了一波强力的 Fel 。

    小 E 正在着手对项目指标算费改造方案规划中……

    有兴趣想知晓后续的同学可以留言并分享哦

    ----------------------------------- END -----------------------------------

    盼望着 盼望着

    小 E 的女朋友更近了

    最近小 E 正在学习小程序相关的知识并开发了自己的小程序,有兴趣的同学可以加小 E 的 VX 并备注“小程序”,小 E 的 VX: Egzasn

    也可以关注小 E 的公众号: 墨鲸说话

    linksNoFound
        1
    linksNoFound  
       2021-03-01 14:06:28 +08:00
    文案直接开除吧
    egzosn
        2
    egzosn  
    OP
       2021-03-01 14:09:13 +08:00
    不敢开除
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.