阅读更多

28顶
0踩

开源软件
简介
Fel(Fast Expression Language)是开放的、高效的、轻量级的表达式语言。拥有解释执行和编译执行双引擎。Fel在编译执行时,做了很多优化,适合处理海量数据。Fel扩展性强,用户可以定制Fel执行时的众多环节,以满足需求。Fel学习门槛非常低,基本上可以做到拿来即用,即使是二次开发,也非常简单。Fel基于Java1.5开发,适用于Java1.5及以上版本。

示例
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext(); 
ctx.set("单价", 5000); 
ctx.set("数量", 12); 
ctx.set("运费", 7500); 
Object result = fel.eval("单价*数量+运费"); 
System.out.println(result);

输出结果:67500

更多内容请参考
项目地址:http://code.google.com/p/fast-el/
讨论贴:http://www.iteye.com/topic/1114021
性能测试:http://code.google.com/p/fast-el/wiki/Performance

备注
Fel还在持续发展中,功能尚不完善,更谈不上完美,但是它的性能及扩展性值得花费几分钟试用。用户越多,动力越足(即使用户不多,也会坚持做下去,因为现在还没有发现有哪个EL完全超越了Fel)。另外,如果有人知道比Fel更快的EL,请告诉我,不胜感激。
28
0
评论 共 37 条 请登录后发表评论
17 楼 lotusyu 2011-09-16 08:57
LieZueYang 写道
有OSWorkFlow里面的script功能强大不?

论功能,很明显EL是比不上script的。
16 楼 lotusyu 2011-09-16 08:56
jjxlcsw 写道
不支持三元表达式,就基本的功能都没有

受不了了,不就是三元表达式吗,周末弄出来。
15 楼 lotusyu 2011-09-16 08:55
wenshao 写道
你可以看看我做的SimpleEL  http://code.alibabatech.com/svn/simpleel/

哈哈,大名鼎鼎的温少也来凑热闹了。
14 楼 LieZueYang 2011-09-16 08:41
有OSWorkFlow里面的script功能强大不?
13 楼 jjxlcsw 2011-09-16 08:32
不支持三元表达式,就基本的功能都没有
12 楼 wenshao 2011-09-16 06:33
你可以看看我做的SimpleEL  http://code.alibabatech.com/svn/simpleel/
11 楼 ansjsun 2011-09-15 20:36
lotusyu 写道
ansjsun 写道
和直接构造实体类有区别么..具体应用场景在什么地方啊??效率要比hashmap高很多么

表达式是动态的,一般由用户创建,或由程序自动生成,不能硬编码的。
可以应用在数据过滤、条件匹配、公式求值、工作流路由等。现在很多的开源框也会用到EL,总之,凡是支持用户写表达式的地方,都可以使用EL。
至于效率,不知道你为何拿HashMap做比较?


我愚昧了..我很少...有这种需求的..不过我感觉比如用户在前台输入
"A+B*C" 字符串传到后台..然后我根据运算符分割..然后算出来HashMap.get("A")+HashMap.get("B")*HashMap.get("C")....意思差不多吧
10 楼 daifeng130 2011-09-15 20:04
感谢楼主,准备应用到自己的项目中。之前一直不知道java怎么实现eval,没办法在前台使用javascript的eval动态解析表达式。
9 楼 lotusyu 2011-09-15 19:37
to jindw
首先谢谢你花时间来做测试。
1:Fel目前还不支持三元表达式,三元表达式的部分在解析时就会失败的。
2:关于其他测试,由于提供的信息不是很完整(没有提供变量值),请提供变量值。
8 楼 jindw 2011-09-15 19:09
测试了一下,性能还行,貌似问题还挺多的,特别是计算结果和大多数表达式不一致,可能是设计的区别吧:

---------------------
测试结果不一致:Aviator=true,FEL=false
Source:'A' == 'A' || 'B' == 'B' && 'ABCD' == t &&  'A' == 'A' (result=false)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		23.468737 		0.765638  		5.455706  		9.158572  		24.729685 		0.659133  
Scale:		35.605465 		1.1615834 		8.277094  		13.894877 		37.518505 		1.0       
---------------------
测试结果不一致:Aviator=11181.0,FEL=11181
Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71(result=11181)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		98.17491  		0.802851  		18.891588 		0.201033  		26.838396 		0.076136  
Scale:		1289.4677 		10.544959 		248.1295  		2.640446  		352.50598 		1.0       
---------------------
测试结果不一致:JSEL=1,MVEL=-7
测试结果不一致:MVEL=-7,Ognl=1
line 1:13 no viable alternative at character '?'
测试结果不一致:Aviator=1,FEL=false
Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3(result=false)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		22.406252 		0.147995  		9.902396  		0.23568   		6.764135  		0.135163  
Scale:		165.77208 		1.0949372 		73.26263  		1.7436725 		50.04428  		1.0       
---------------------
表达式测试异常:Ognljavassist.CannotCompileException: [source error] ) is missing
测试结果不一致:MVEL=true,Ognl=null
测试结果不一致:Ognl=null,Aviator=true
java.lang.NullPointerException
	at com.greenpineyu.fel.compile.FelCompiler16.compile(Unknown Source)
	at com.greenpineyu.fel.compile.CompileService.compile(Unknown Source)
	at com.greenpineyu.fel.FelEngineImpl.compile(Unknown Source)
	at com.googlecode.templatetest.ELTimeTest.doFELTest(ELTimeTest.java:200)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.googlecode.templatetest.ELTimeTest.doTest(ELTimeTest.java:110)
	at com.googlecode.templatetest.ELTimeTest.testEL(ELTimeTest.java:79)
	at com.googlecode.templatetest.ELTimeTest.main(ELTimeTest.java:71)
表达式测试异常:FELjava.lang.NullPointerException
测试结果不一致:Aviator=true,FEL=null
Source:i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99(result=null)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		32.609768 		12.694195 		414.54388 		2147.4836 		142.10158 		2147.4836 
Scale:		2.5688725 		1.0       		32.656178 		169.17053 		11.194218 		169.17053 
---------------------
测试结果不一致:JSEL=314.0,MVEL=314.0000104904175
测试结果不一致:MVEL=314.0000104904175,Ognl=314.0
测试结果不一致:Ognl=314.0,Aviator=314.0000104904175
java.lang.NullPointerException
	at com.greenpineyu.fel.compile.FelCompiler16.compile(Unknown Source)
	at com.greenpineyu.fel.compile.CompileService.compile(Unknown Source)
	at com.greenpineyu.fel.FelEngineImpl.compile(Unknown Source)
	at com.googlecode.templatetest.ELTimeTest.doFELTest(ELTimeTest.java:200)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.googlecode.templatetest.ELTimeTest.doTest(ELTimeTest.java:110)
	at com.googlecode.templatetest.ELTimeTest.testEL(ELTimeTest.java:80)
	at com.googlecode.templatetest.ELTimeTest.main(ELTimeTest.java:71)
表达式测试异常:FELjava.lang.NullPointerException
测试结果不一致:Aviator=314.0000104904175,FEL=null
Source:i * pi(result=null)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		1.302013  		0.39779   		10.542709 		0.54664   		4.705039  		2147.4836 
Scale:		3.2731164 		1.0       		26.503202 		1.3741924 		11.827947 		5398.536  
---------------------
Source:1(result=1)
Labels:		JXEL      		JSEL      		MVEL      		Ognl      		Aviator   		FEL       
Times:		0.057744  		0.079986  		2.916269  		0.363571  		2.856814  		0.053038  
Scale:		1.0887288 		1.5080886 		54.98452  		6.854915  		53.863533 		1.0       
---------------------
表达式测试异常:Aviatorcom.googlecode.aviator.exception.ExpressionRuntimeException: Execute expression error
测试结果不一致:Ognl=4,Aviator=null
java.lang.NullPointerException
	at com.greenpineyu.fel.compile.FelCompiler16.compile(Unknown Source)
	at com.greenpineyu.fel.compile.CompileService.compile(Unknown Source)
	at com.greenpineyu.fel.FelEngineImpl.compile(Unknown Source)
	at com.googlecode.templatetest.ELTimeTest.doFELTest(ELTimeTest.java:200)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)表达式测试异常:FELjava.lang.NullPointerException
测试结果类型不一致:result=null,
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.googlecode.templatetest.ELTimeTest.doTest(ELTimeTest.java:110)
	at com.googlecode.templatetest.ELTimeTest.testEL(ELTimeTest.java:82)
	at com.googlecode.templatetest.ELTimeTest.main(ELTimeTest.java:71)
Exception in thread "main" java.lang.NullPointerException
	at com.googlecode.templatetest.ELTimeTest.doTest(ELTimeTest.java:129)
	at com.googlecode.templatetest.ELTimeTest.testEL(ELTimeTest.java:82)
	at com.googlecode.templatetest.ELTimeTest.main(ELTimeTest.java:71)



7 楼 lotusyu 2011-09-15 16:18
nick.s.ni 写道
與在Java中使用腳本語言如javascript有什麽區別?感覺差不多。效率就不知道了。
我有在Java中使用腳本語言輸出文件。功能面感覺腳本已經够了

够用就好。Fel的效率和java中内置的脚本语言不是一个级别的。
6 楼 nick.s.ni 2011-09-15 15:46
與在Java中使用腳本語言如javascript有什麽區別?感覺差不多。效率就不知道了。
我有在Java中使用腳本語言輸出文件。功能面感覺腳本已經够了
5 楼 sjsky 2011-09-15 11:27
我觉得 Expr4J 这个蛮好的
4 楼 lotusyu 2011-09-15 11:20
ansjsun 写道
和直接构造实体类有区别么..具体应用场景在什么地方啊??效率要比hashmap高很多么

表达式是动态的,一般由用户创建,或由程序自动生成,不能硬编码的。
可以应用在数据过滤、条件匹配、公式求值、工作流路由等。现在很多的开源框也会用到EL,总之,凡是支持用户写表达式的地方,都可以使用EL。
至于效率,不知道你为何拿HashMap做比较?

3 楼 lotusyu 2011-09-15 11:15
susam 写道
不支持三元表达式, 最基本的判断选择都没有了。

以后版本会加上三元表达式功能。判断选择也不是一定要使用三元表达式,加一个自定义函数就可以实现判断选择的功能。开发人员喜欢使用三元表达式,最终用户倾向使用函数。
2 楼 ansjsun 2011-09-15 11:01
和直接构造实体类有区别么..具体应用场景在什么地方啊??效率要比hashmap高很多么
1 楼 susam 2011-09-15 10:52
不支持三元表达式, 最基本的判断选择都没有了。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics