`
yancel
  • 浏览: 13663 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Fel使用例子

    博客分类:
  • java
 
阅读更多

Fel使用例子:

 

1:算术表达式:

 

FelEngine fel = new FelEngineImpl();    

Object result = fel.eval("5000*12+7500");    

System.out.println(result);  

 

输出结果:67500

 

2:变量

 

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

 

FelContext ctx = fel.getContext();    

ctx.set("单价", 5000);    

ctx.set("数量", 12);    

ctx.set("运费", 7500);    

Object result = fel.eval("单价*数量+运费");    

System.out.println(result);  

 

输出结果:67500

 

3:访问对象属性

 

在Fel中,可能非常方便的访问对象属性,示例代码如下所示

 

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");

 

4:访问数组、集合、Map

 

FelEngine fel = new FelEngineImpl();

FelContext ctx = fel.getContext();

 

//数组

int[] intArray = {1,2,3};

ctx.set("intArray",intArray);

//获取intArray[0]

String exp = "intArray[0]";

System.out.println(exp+"->"+fel.eval(exp));

 

//List

List<Integer> list = Arrays.asList(1,2,3);

ctx.set("list",list);

//获取list.get(0)

exp = "list[0]";

System.out.println(exp+"->"+fel.eval(exp));

 

//集合

Collection<String> coll = Arrays.asList("a","b","c");

ctx.set("coll",coll);

//获取集合最前面的元素。执行结果为"a"

exp = "coll[0]";

System.out.println(exp+"->"+fel.eval(exp));

 

//迭代器

Iterator<String> iterator = coll.iterator();

ctx.set("iterator", iterator);

//获取迭代器最前面的元素。执行结果为"a"

exp = "iterator[0]";

System.out.println(exp+"->"+fel.eval(exp));

 

//Map

Map<String,String> m = new HashMap<String, String>();

m.put("name", "HashMap");

ctx.set("map",m);

exp = "map.name";

System.out.println(exp+"->"+fel.eval(exp));

 

//多维数组

int[][] intArrays= {{11,12},{21,22}};

ctx.set("intArrays",intArrays);

exp = "intArrays[0][0]";

System.out.println(exp+"->"+fel.eval(exp));

 

//多维综合体,支持数组、集合的任意组合。

List<int[]> listArray = new ArrayList<int[]>();

listArray.add(new int[]{1,2,3});

listArray.add(new int[]{4,5,6});

ctx.set("listArray",listArray);

exp = "listArray[0][0]";

System.out.println(exp+"->"+fel.eval(exp));

 

5:调用JAVA方法

 

FelEngine fel = new FelEngineImpl();   

FelContext ctx = fel.getContext();   

ctx.set("out", System.out);   

fel.eval("out.println('Hello Everybody'.substring(6))");  

 

输出结果:Everybody

 

6:自定义上下文环境

 

//负责提供气象服务的上下文环境   

FelContext ctx = new AbstractConetxt() {   

    public Object get(Object name) {   

        if("天气".equals(name)){   

            return "晴";   

        }   

        if("温度".equals(name)){   

            return 25;   

        }   

        return null;   

    }   

};   

FelEngine fel = new FelEngineImpl(ctx);   

Object eval = fel.eval("'天气:'+天气+';温度:'+温度");   

System.out.println(eval);  

 

输出结果:天气:晴;温度:25

 

7:多层上下文环境(命名空间)

 

FelEngine fel = new FelEngineImpl();   

String costStr = "成本";   

String priceStr="价格";   

FelContext baseCtx = fel.getContext();   

//父级上下文中设置成本和价格   

baseCtx.set(costStr, 50);   

baseCtx.set(priceStr,100);   

   

String exp = priceStr+"-"+costStr;   

Object baseCost = fel.eval(exp);   

System.out.println("期望利润:" + baseCost);   

   

FelContext ctx = new ContextChain(baseCtx, new MapContext());   

//通货膨胀导致成本增加(子级上下文 中设置成本,会覆盖父级上下文中的成本)   

ctx.set(costStr,50+20 );   

Object allCost = fel.eval(exp, ctx);   

System.out.println("实际利润:" + allCost);  

 

输出结果:

 

期望利润:50

 

实际利润:30

 

8:编译执行

 

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

 

备注:适合处理海量数据,编译执行的速度基本与Java字节码执行速度一样快。

 

9:自定义函数

 

    //定义hello函数   

    Function fun = new CommonFunction() {   

  

        public String getName() {   

            return "hello";   

        }   

           

        /*   

         * 调用hello("xxx")时执行的代码  

         */   

        @Override   

        public Object call(Object[] arguments) {   

            Object msg = null;   

            if(arguments!= null && arguments.length>0){   

                msg = arguments[0];   

            }   

            return ObjectUtils.toString(msg);   

        }   

  

    };   

    FelEngine e = new FelEngineImpl();   

    //添加函数到引擎中。   

    e.addFun(fun);   

    String exp = "hello('fel')";   

    //解释执行   

    Object eval = e.eval(exp);   

    System.out.println("hello "+eval);   

    //编译执行   

    Expression compile = e.compile(exp, null);   

    eval = compile.eval(null);   

    System.out.println("hello "+eval);   

 

 

执行结果:

 

hello fel hello fel

 

10:调用静态方法

 

如果你觉得上面的自定义函数也麻烦,Fel提供的$函数可以方便的调用工具类的方法 熟悉jQuery的朋友肯定知道"$"函数的威力。Fel东施效颦,也实现了一个"$"函数,其作用是获取class和创建对象。结合点操作符,可以轻易的调用工具类或对象的方法。

 

  //调用Math.min(1,2)

  FelEngine.instance.eval("$('Math').min(1,2)");

  //调用new Foo().toString();

  FelEngine.instance.eval("$('com.greenpineyu.test.Foo.new').toString());

 

通过"$('class').method"形式的语法,就可以调用任何等三方类包(commons lang等)及自定义工具类的方法,也可以创建对象,调用对象的方法。 未来版本的Fel会考虑直接注册java method。

分享到:
评论

相关推荐

    表达式引擎fel-0.9版本

    8. **文档和示例**:通常,一个成熟的开源项目会提供详细的文档和示例,帮助开发者快速上手和理解Fel引擎的用法和功能。 0.9版本可能修复了一些已知问题,增强了稳定性和兼容性,是Fel引擎发展的一个重要里程碑。...

    fel-0.8.zip

    例如,一个简单的使用示例可能是: ```java import org.fel.FelEngine; import org.fel.api.FelContext; FelEngine engine = new FelEngine(); FelContext context = engine.createContext(); // 设置上下文变量 ...

    高速 Fel表达式引擎

    #### 五、示例代码分析 - **算术表达式计算**: ```java FelEngine fel = new FelEngineImpl(); Object result = fel.eval("5000 * 12 + 7500"); System.out.println(result); // 输出结果:67500 ``` - **变量...

    Fel表达式引擎.pdf

    "Fel表达式引擎" Fel表达式引擎是一种高性能的表达式引擎,支持编译执行和解释执行两种模式。它可以处理海量数据,执行速度基本与Java字节码执行速度一样快。 1. FelEngine的使用 FelEngine是Fel表达式引擎的核心...

    felDemo.rar

    标题"FelDemo.rar"指的是一个包含FEL(Fast Expression Language)表达式注入示例的压缩文件。FEL是一种轻量级、高效的Java表达式语言,主要用于简化和加速应用程序中的动态计算。在这个demo中,我们看到如何使用FEL...

    Fel表达式引擎

    下面是一些Fel的基本使用示例: 1. **算术表达式计算** ```java FelEngine fel = new FelEngineImpl(); Object result = fel.eval("5000*12+7500"); System.out.println(result); // 输出结果:67500 ``` 2. ...

    fel_server:Spring RESTful服务器公开Yahoo FEL实体链接服务

    快速实体链接RESTful服务fel_server是一个Spring应用程序,它公开了RESTful API,用于来自Yahoo的自定义版本的快速实体链接(FEL)服务。 目前,该服务针对请求中指定的源文本中每个文本范围返回候选注释列表。 默认...

    Genesis 1.3:与时间有关的FEL代码-开源

    同时,开发者也可能提供了更详尽的文档和示例,帮助用户更好地理解和使用软件。 总结来说, Genesis 1.3 是一个强大且灵活的工具,它通过开源的方式推动了FEL领域的研究。其与时间相关的特性,使得科研人员能够深入...

    OCELOT是一个多物理场仿真工具包,专为研究FEL和.zip

    用户可以通过克隆或下载此仓库,然后根据指导进行编译和安装,以在本地环境中使用OCELOT进行FEL的仿真。 总结来说,OCELOT是一款强大的多物理场仿真工具,专为自由电子激光器的研究而设计,具备丰富的功能和高度的...

    cargo-fel4:一个用于处理feL4项目的Cargo子命令

    安装后,使用cargo fel4 new my-project创建一个新的feL4项目,这是一个常规的Rust no_std库项目,具有一些其他配置要求。 在那个项目中,运行cargo fel4 build将生成一个包装来自src/lib.rs库代码的seL4应用程序...

    matlab分时代码-pelican:在C++和MATLAB中求解FEL方程

    matlab分时代码鹈 一维时间相关的FEL代码 描述 解决一维自由电子激光方程,获得FEL输出功率,同时提供C ++和MATLAB版本。 MATLAB函数: pelican.m和pelicanT.m可...有关示例,请参见和。 对于C ++版本,该文档位于。

    CitiesCoif.mh6fel3w93.cf2p2HA

    【标题】"CitiesCoif.mh6fel3w93.cf2p2HA"似乎是一个非标准的文件名,可能是由于某种加密或混淆机制产生的。在这种情况下,通常这个文件名并没有特殊的含义,而是用于标识一个特定的压缩包。不过,由于它没有提供...

    FEL-Demo:Google Fast-el

    【标题】"FEL-Demo:Google Fast-el" 在IT领域,"FEL"通常指的是Fast Element Language,这是一种轻量级、高效的动态脚本语言,主要用于简化和加速Web应用程序的开发。Google Fast-el是FEL的一个实现,它与Java生态...

    aviator 表达式解析

    Aviator是一个高性能、轻量级的Java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。它的设计目标是轻量级和高性能,相比于Groovy、JRuby等...它的性能优秀,使用简单,功能强大,非常适合在大型项目中使用。

    ok-computer:我在 291115 上的 FEL 演讲“OK Computer”中的幻灯片

    OK 电脑伦敦前端,29/01/15 我的幻灯片来自#FEL。 在语音合成和语音识别方面,浏览器和第三方服务中的本地实现。 大量活生生的例子。 运行npm install进行设置, grunt serve运行。 一些演示适用于不同的浏览器,但...

    BPI+FLASH配置MicroBlaze软核总结

    bootloader 需要自己编写,主要功能是将 BPI Flash 中的应用程序复制到 DDR(SDRAM)中,复制完成后,跳转到 DDR(SDRAM)的起始处,开始执行应用程序,Xilinx 公司有 bootloader 的例子,可根据例子进行修改。...

    sanghanet:FelébredtTudatMagyarországKft的管理Web应用程序

    最初设定克隆回购运行npm ... .env.local的示例: DEV_SERVER = 1 DB_URL=mongodb://localhost:test/27017 PORT=4000 CLIENT_ID=55347337253-aglrjccot9o1n7s2caborv6gnee634pf.apps.googleusercontent.com

    hyphy-support:针对HyPhy问题创建的示例补丁等

    这个项目名为“hyphy-support”的压缩包,显然包含了一系列与解决HyPhy使用过程中遇到的问题相关的示例和补丁。下面将详细讨论HyPhy的基本概念、功能以及如何利用提供的支持资源。 HyPhy是一个基于命令行的工具,...

    Disc Type NTC Thermistors

    根据提供的文件信息,我们可以深入探讨有关“Disc Type NTC Thermistors”的技术细节与应用。 ### Disc Type NTC Thermistors概述 ...对于设计人员来说,理解这些技术细节对于正确选择和使用NTC热敏电阻至关重要。

    真空紫外和X射线自由电子激光器

    直线加速器的最新进展、激光驱动低发射度电子枪的新发展和超高精度长摆动器的可行性,开创了以自放大自发辐射(SASE...提出了克服统计起伏和增加纵向相干性的方案,给出了与这种自由电子激光有关的基础研究和应用研究例子.

Global site tag (gtag.js) - Google Analytics