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

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

Fel有多快?
通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。速度是Jexl-2.0的20倍以上。

目前还没有发现开源的表达式引擎比Fel快。

具体的测试数据请参见http://code.google.com/p/fast-el/wiki/Performance。

为何要使用Fel?
Fel语法和API非常简单,语法与Java基本相同,几乎没有学习成本。

Fel非常快,上面已经做了简单说明。

Fel整个包只有200多KB。

Fel可以非常方便的访问数组、集合、Map的元素和对象的属性。

Fel可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。

Fel支持大数值高精度计算

Fel有良好的安全管理功能

如果Fel不能满足你的要求,扩展和修改Fel很简单。

Fel不能做什么?
Fel只支持表达式,不支持脚本。

Fel适用场景:
Fel适合处理海量数据,Fel良好的扩展性可以更好的帮助用户处理数据。

Fel同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)

安装
1:获取Fel
项目主页:http://code.google.com/p/fast-el/ 下载地址:http://code.google.com/p/fast-el/downloads/list

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等)及自定义工具类的方法,也可以创建对象,调用对象的方法。如果有需要,还可以直接注册Java Method到函数管理器中。

11 大数值计算(始于0.9版本)

Fel发布后,有些网友希望提供大数值计算功能,于是,大数值计算功能就有了。例子如下:

  FelEngine fel = FelBuilder.bigNumberEngine();String input = "111111111111111111111111111111+22222222222222222222222222222222";Object value = fel.eval(input);Object compileValue = fel.compile(input, fel.getContext()).eval(fel.getContext());System.out.println("大数值计算(解释执行):" + value);System.out.println("大数值计算(编译执行):" + compileValue);

由上例子可以看出,大数值计算引擎和常规计算引擎在使用方法是相同的。如果表达式数值比较大,要求精度高,可使用大数值计算引擎。不足之处是效率没有常规计算引擎高。

安全(始于0.8版本)

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

Example类:

  1 public class Example {
  2
  3     public static void main(String[] args) {
  4
  5         System.out.println("-----------1.入门---------");
  6         helloworld();
  7
  8         System.out.println("-----------2.使用变量---------");
  9         useVariable();
 10
 11         System.out.println("-----------3.获取对象属性---------");
 12         getAttr();
 13
 14         System.out.println("---------4.调用对象的方法-----------");
 15         callMethod();
 16
 17         System.out.println("--------5.访问数组、集合------------");
 18         visitColl();
 19
 20         System.out.println("--------6.自定义上下文环境------------");
 21         context();
 22
 23         System.out.println("--------7.多层次上下文环境(变量命名空间)------------");
 24         contexts();
 25
 26         System.out.println("---------8.大数值计算-----------");
 27         testBigNumber();
 28
 29         System.out.println("----------9.函数----------");
 30         userFunction();
 31
 32         System.out.println("---------10.自定义 解释器-----------");
 33         userInterpreter();
 34
 35         System.out.println("----------11.操作符重载----------");
 36         operatorOverload();
 37
 38         System.out.println("----------12.速度测试----------");
 39         testSpeed();
 40
 41         System.out.println("----------13.静态方法----------");
 42         staticMethod();
 43     }
 44
 45     /**
 46      * 入门
 47      */
 48     public static void helloworld() {
 49         // FelEngine fel = new FelEngineImpl();
 50         Object result = FelEngine.instance.eval("5000*12+7500");
 51         System.out.println(result);
 52     }
 53
 54     /**
 55      * 使用变量
 56      */
 57     public static void useVariable() {
 58         FelEngine fel = getEngine();
 59         FelContext ctx = fel.getContext();
 60         ctx.set("单价", 5000);
 61         ctx.set("数量", 12);
 62         ctx.set("运费", 7500);
 63         Object result = fel.eval("单价*数量+运费");
 64         System.out.println(result);
 65     }
 66
 67     /**
 68      * 获取对象属性
 69      */
 70     public static void getAttr() {
 71         FelEngine fel = getEngine();
 72         FelContext ctx = fel.getContext();
 73         Foo foo = new Foo();
 74         ctx.set("foo", foo);
 75         Map<String, String> m = new HashMap<String, String>();
 76         m.put("ElName", "fel");
 77         ctx.set("m", m);
 78
 79         // 调用foo.getSize()方法。
 80         Object result = fel.eval("foo.size");
 81         System.out.println(result);
 82         // 调用foo.isSample()方法。
 83         result = fel.eval("foo.sample");
 84         System.out.println(result);
 85         // foo没有name、getName、isName方法
 86         // foo.name会调用foo.get("name")方法。
 87         result = fel.eval("foo.name");
 88         System.out.println(result);
 89         // m.ElName会调用m.get("ElName");
 90         result = fel.eval("m.ElName");
 91         System.out.println(result);
 92     }
 93
 94     /**
 95      * 调用对象的方法
 96      */
 97     public static void callMethod() {
 98         FelEngine fel = getEngine();
 99         FelContext ctx = fel.getContext();
100         ctx.set("out", System.out);
101         fel.eval("out.println('Hello Everybody'.substring(6))");
102     }
103
104     /**
105      * 访问数组、集合
106      */
107     public static void visitColl() {
108         FelEngine fel = getEngine();
109         FelContext ctx = fel.getContext();
110
111         // 数组
112         int[] intArray = { 1, 2, 3 };
113         ctx.set("intArray", intArray);
114         // 获取intArray[0]
115         String exp = "intArray[0]";
116         System.out.println(exp + "->" + fel.eval(exp));
117
118         // List
119         List<Integer> list = Arrays.asList(1, 2, 3);
120         ctx.set("list", list);
121         // 获取list.get(0)
122         exp = "list[0]";
123         System.out.println(exp + "->" + fel.eval(exp));
124
125         // 集合
126         Collection<String> coll = Arrays.asList("a", "b", "c");
127         ctx.set("coll", coll);
128         // 获取集合最前面的元素。执行结果为"a"
129         exp = "coll[0]";
130         System.out.println(exp + "->" + fel.eval(exp));
131
132         // 迭代器
133         Iterator<String> iterator = coll.iterator();
134         ctx.set("iterator", iterator);
135         // 获取迭代器最前面的元素。执行结果为"a"
136         exp = "iterator[0]";
137         System.out.println(exp + "->" + fel.eval(exp));
138
139         // Map
140         Map<String, String> m = new HashMap<String, String>();
141         m.put("name", "Wangxiaoming");
142         ctx.set("map", m);
143         exp = "map.name";
144         System.out.println(exp + "->" + fel.eval(exp));
145
146         // 多维数组
147         int[][] intArrays = { { 11, 12 }, { 21, 22 } };
148         ctx.set("intArrays", intArrays);
149         exp = "intArrays[0][0]";
150         System.out.println(exp + "->" + fel.eval(exp));
151
152         // 多维综合体,支持数组、集合的任意组合。
153         List<int[]> listArray = new ArrayList<int[]>();
154         listArray.add(new int[] { 1, 2, 3 });
155         listArray.add(new int[] { 4, 5, 6 });
156         ctx.set("listArray", listArray);
157         exp = "listArray[0][0]";
158         System.out.println(exp + "->" + fel.eval(exp));
159     }
160
161     /**
162      * 自定义上下文环境
163      */
164     public static void context() {
165         // 负责提供气象服务的上下文环境
166         FelContext ctx = new AbstractContext() {
167             @Override
168             public Object get(String name) {
169                 if ("天气".equals(name)) {
170                     return "晴";
171                 }
172                 if ("温度".equals(name)) {
173                     return 25;
174                 }
175                 return null;
176             }
177
178         };
179         FelEngine fel = new FelEngineImpl(ctx);
180         String exp = "'天气-----:'+天气+';温度------:'+温度";
181         Object eval = fel.compile(exp, ctx).eval(ctx);
182         System.out.println(eval);
183     }
184
185     /**
186      * 多层次上下文环境(变量命名空间)
187      */
188     public static void contexts() {
189         FelEngine fel = getEngine();
190         String costStr = "成本";
191         String priceStr = "价格";
192         FelContext baseCtx = fel.getContext();
193         // 父级上下文中设置成本和价格
194         baseCtx.set(costStr, 50);
195         baseCtx.set(priceStr, 100);
196
197         String exp = priceStr + "-" + costStr;
198         Object baseCost = fel.eval(exp);
199         System.out.println("期望利润:" + baseCost);
200
201         FelContext ctx = new ContextChain(baseCtx, new MapContext());
202         // 通货膨胀导致成本增加(子级上下文 中设置成本,会覆盖父级上下文中的成本)
203         ctx.set(costStr, 50 + 20);
204         Object allCost = fel.eval(exp, ctx);
205         System.out.println("实际利润:" + allCost);
206     }
207
208     /**
209      * 大数值计算
210      */
211     public static void testBigNumber() {
212         // 构建大数值计算引擎
213         FelEngine fel = FelBuilder.bigNumberEngine();
214         String input = "111111111111111111111111111111+22222222222222222222222222222222";
215         Object value = fel.eval(input);// 解释执行
216         Object compileValue = fel.compile(input, fel.getContext()).eval(
217                 fel.getContext());// 编译执行
218         System.out.println("大数值计算(解释执行):" + value);
219         System.out.println("大数值计算(编译执行):" + compileValue);
220     }
221
222     /**
223      * 函数
224      */
225     public static void userFunction() {
226         // 定义hello函数
227         Function fun = new CommonFunction() {
228
229             @Override
230             public String getName() {
231                 return "hello";
232             }
233
234             /*
235              * 调用hello("xxx")时执行的代码
236              */
237             @Override
238             public Object call(Object[] arguments) {
239                 Object msg = null;
240                 if (arguments != null && arguments.length > 0) {
241                     msg = arguments[0];
242                 }
243                 return ObjectUtils.toString(msg);
244             }
245
246         };
247         FelEngine e = getEngine();
248         // 添加函数到引擎中。
249         e.addFun(fun);
250         String exp = "hello('fel')";
251         // 解释执行
252         Object eval = e.eval(exp);
253         System.out.println("hello " + eval);
254         // 编译执行
255         Expression compile = e.compile(exp, null);
256         eval = compile.eval(null);
257         System.out.println("hello " + eval);
258     }
259
260     /**
261      *
262      */
263     public static void testCompileX() {
264         FelEngine fel = getEngine();
265         String exp = "单价*数量";
266         final MutableInt index = new MutableInt(0);
267
268         // 数据库中单价列的记录
269         final int[] price = new int[] { 2, 3, 4 };
270         // 数据库中数量列的记录
271         final double[] number = new double[] { 10.99, 20.99, 9.9 };
272         FelContext context = new AbstractContext() {
273
274             @Override
275             public Object get(String name) {
276                 if ("单价".equals(name)) {
277                     return price[index.intValue()];
278                 }
279                 if ("数量".equals(name)) {
280                     return number[index.intValue()];
281                 }
282                 return null;
283             }
284         };
285         Expression compExp = fel.compile(exp, context);
286         for (int i = 0; i < number.length; i++) {
287             index.setValue(i);
288             Object eval = compExp.eval(context);
289             System.out.println("总价[" + price[i] + "*" + number[i] + "=" + eval
290                     + "]");
291         }
292     }
293
294     /**
295      * 自定义 解释器
296      */
297     public static void userInterpreter() {
298         FelEngine fel = getEngine();
299         String costStr = "成本";
300         FelContext rootContext = fel.getContext();
301         rootContext.set(costStr, "60000");
302         FelNode node = fel.parse(costStr);
303         // 将变量解析成常量
304         node.setInterpreter(new ConstInterpreter(rootContext, node));
305         System.out.println(node.eval(rootContext));
306     }
307
308     /**
309      * 操作符重载,使用自定义解释器实现操作符重载
310      */
311     public static void operatorOverload() {
312         /*
313          * 扩展Fel的+运算符,使其支持数组+数组
314          */
315
316         FelEngine fel = getEngine();
317         // 单价
318         double[] price = new double[] { 2, 3, 4 };
319         // 费用
320         double[] cost = new double[] { 0.3, 0.3, 0.4 };
321         FelContext ctx = fel.getContext();
322         ctx.set("单价", price);
323         ctx.set("费用", cost);
324         String exp = "单价+费用";
325         Interpreters interpreters = new Interpreters();
326         // 定义"+"操作符的解释方法。
327         interpreters.add("+", new Interpreter() {
328             @Override
329             public Object interpret(FelContext context, FelNode node) {
330                 List<FelNode> args = node.getChildren();
331                 double[] leftArg = (double[]) args.get(0).eval(context);
332                 double[] rightArg = (double[]) args.get(1).eval(context);
333                 return sum(leftArg) + sum(rightArg);
334             }
335
336             // 对数组进行求和
337             public double sum(double[] array) {
338                 double d = 0;
339                 for (int i = 0; i < array.length; i++) {
340                     d += array[i];
341                 }
342                 return d;
343             }
344         });
345
346         // 使用自定义解释器作为编译选项进行进行编译
347         Expression expObj = fel.compile(exp, null, interpreters);
348         Object eval = expObj.eval(ctx);
349         System.out.println("数组相加:" + eval);
350     }
351
352     /**
353      * 速度测试
354      */
355     public static void testSpeed() {
356         FelEngine fel = getEngine();
357         String exp = "40.52334+60*(21.8144+17*32.663)";
358         FelNode node = fel.parse(exp);
359         int times = 1000;
360         long s1 = System.currentTimeMillis();
361         for (int i = 0; i < times; i++) {
362             // double j = 40.52334 + 60 * (21.8144 + 17 * 32.663);
363             node.eval(null);
364         }
365         long s2 = System.currentTimeMillis();
366         System.out.println("花费的时间:" + (s2 - s1));
367     }
368
369     /**
370      * 大数据量计算(计算1千万次)
371      */
372     public static void massData() {
373         FelEngine fel = getEngine();
374         final Interpreters opti = new Interpreters();
375         final MutableInt index = new MutableInt(0);
376         int count = 10 * 1000 * 1000;
377         final double[] counts = new double[count];
378         final double[] prices = new double[count];
379         Arrays.fill(counts, 10d);
380         Arrays.fill(prices, 2.5d);
381         opti.add("单价", new Interpreter() {
382             @Override
383             public Object interpret(FelContext context, FelNode node) {
384                 return prices[index.intValue()];
385             }
386         });
387         opti.add("数量", new Interpreter() {
388             @Override
389             public Object interpret(FelContext context, FelNode node) {
390                 return counts[index.intValue()];
391             }
392         });
393         Expression expObj = fel.compile("单价*数量", null, opti);
394         long start = System.currentTimeMillis();
395         Object result = null;
396         for (int i = 0; i < count; i++) {
397             result = expObj.eval(null);
398             index.increment();
399         }
400         long end = System.currentTimeMillis();
401
402         System.out.println("大数据量计算:" + result + ";耗时:" + (end - start));
403     }
404
405     /**
406      * 静态方法
407      *
408      *
409      * 如果你觉得上面的自定义函数也麻烦,Fel提供的$函数可以方便的调用工具类的方法 熟悉jQuery的朋友肯定知道"$"函数的威力。
410      * Fel东施效颦,也实现了一个"$"函数,其作用是获取class和创建对象。结合点操作符,可以轻易的调用工具类或对象的方法。
411      * 通过"$('class').method"形式的语法,就可以调用任何等三方类包(commons lang等)及自定义工具类的方法,
412      * 也可以创建对象,调用对象的方法。如果有需要,还可以直接注册Java Method到函数管理器中。
413      */
414     public static void staticMethod() {
415         // 调用Math.min(1,2)
416         System.out.println(FelEngine.instance.eval("$('Math').max(1,3)"));
417         // 调用new Foo().toString();
418         System.out.println(FelEngine.instance
419                 .eval("$('com.ebiz.fel.Foo.new').toString()"));
420     }
421
422     private static FelEngine getEngine() {
423         return FelBuilder.engine();
424     }
425
426 }
427
428 class ColumnInterpreter implements Interpreter {
429     MutableInt index;
430
431     double[] records;
432
433     ColumnInterpreter(MutableInt index, double[] records) {
434         this.index = index;
435         this.records = records;
436     }
437
438     @Override
439     public Object interpret(FelContext context, FelNode node) {
440         return records[index.intValue()];
441     }
442 }
443
444 class MutableInt {
445     private int value;
446
447     public MutableInt(int i) {
448         this.value = i;
449     }
450
451     public int intValue() {
452         return value;
453     }
454
455     public void setValue(int i) {
456         this.value = i;
457     }
458
459     public void increment() {
460         value++;
461     }
462 }

Foo类:

  1 import java.util.ArrayList;
  2 import java.util.Iterator;
  3 import java.util.List;
  4
  5 public class Foo {
  6
  7     private final String name;
  8
  9     private Foo foo = null;
 10
 11     static private Foo[] f = new Foo[] { new Foo("array0"), new Foo("array1") };
 12
 13     static private Foo[] fooes = f;
 14
 15     public Foo[] getFooes() {
 16         return fooes;
 17     }
 18
 19     public void setFooes(Foo[] fooes) {
 20         this.fooes = fooes;
 21     }
 22
 23     private boolean beenModified = false;
 24     private String property1 = "some value";
 25
 26     public Foo(String name) {
 27         this.name = name;
 28     }
 29
 30     public Foo() {
 31         this("anonymity");
 32     }
 33
 34     public static String sayHello(String str) {
 35         return "hello" + str;
 36     }
 37
 38     public class Cheezy {
 39         public Iterator<String> iterator() {
 40             return getCheeseList().iterator();
 41         }
 42     }
 43
 44     public String get(String arg) {
 45         if ("name".equals(arg)) {
 46             return name;
 47         }
 48         return "can't find " + arg;
 49     }
 50
 51     public String convertBoolean(boolean b) {
 52         return "Boolean : " + b;
 53     }
 54
 55     public int getCount() {
 56         return 5;
 57     }
 58
 59     public String contact(String a, String b, String c, String d) {
 60         return a + b + c + c;
 61     }
 62
 63     public List<String> getCheeseList() {
 64         ArrayList<String> answer = new ArrayList<String>();
 65         answer.add("cheddar");
 66         answer.add("edam");
 67         answer.add("brie");
 68         return answer;
 69     }
 70
 71     public Cheezy getCheezy() {
 72         return new Cheezy();
 73     }
 74
 75     public boolean isSimple() {
 76         return true;
 77     }
 78
 79     public int square(int value) {
 80         return value * value;
 81     }
 82
 83     public boolean getTrueAndModify() {
 84         beenModified = true;
 85         return true;
 86     }
 87
 88     public boolean getModified() {
 89         return beenModified;
 90     }
 91
 92     public int getSize() {
 93         return 22;
 94     }
 95
 96     public String getProperty1() {
 97         return property1;
 98     }
 99
100     public void setProperty1(String newValue) {
101         property1 = newValue;
102     }
103
104     public Foo getFoo() {
105         return this.foo;
106     }
107
108     public void setFoo(Foo foo) {
109         this.foo = foo;
110     }
111
112     @Override
113     public String toString() {
114         return this.name;
115     }
116 }

运行结果:

 1 -----------1.入门---------
 2 67500
 3 -----------2.使用变量---------
 4 67500
 5 -----------3.获取对象属性---------
 6 22
 7 can't find sample
 8 anonymity
 9 fel
10 ---------4.调用对象的方法-----------
11 Everybody
12 --------5.访问数组、集合------------
13 intArray[0]->1
14 list[0]->1
15 coll[0]->a
16 iterator[0]->a
17 map.name->Wangxiaoming
18 intArrays[0][0]->11
19 listArray[0][0]->1
20 --------6.自定义上下文环境------------
21 天气-----:晴;温度------:25
22 --------7.多层次上下文环境(变量命名空间)------------
23 期望利润:50
24 实际利润:30
25 ---------8.大数值计算-----------
26 大数值计算(解释执行):22333333333333333333333333333333
27 大数值计算(编译执行):22333333333333333333333333333333
28 ----------9.函数----------
29 hello fel
30 hello fel
31 ---------10.自定义 解释器-----------
32 60000
33 ----------11.操作符重载----------
34 数组相加:10.0
35 ----------12.速度测试----------
36 花费的时间:91
37 ----------13.静态方法----------
38 3
39 anonymity

转载:https://blog.csdn.net/chichengjunma/article/details/56012272

转载于:https://www.cnblogs.com/xianfengzhike/p/10233521.html

Fel是轻量级的高效的表达式计算引擎学习(一)相关推荐

  1. java fel_Fel是轻量级的高效的表达式计算引擎

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

  2. Fel轻量高效的表达式计算引擎

    Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运 ...

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

    花满天的季节 盼望着,盼望着,三月悄然来了. 一切都像刚睡醒的样子,犹如婴儿缓缓睁眼. 粉粉嫩嫩的花儿开始羞涩起来, 沉闷程序猿小哥哥开始躁动起来 小E也带着小妹妹悠悠公园深处. 万物生长 桃花运来了 ...

  4. Fel表达式计算引擎学习 侵删

    Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel ...

  5. Fel表达式计算引擎学习

    载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开 ...

  6. 【Fel】Fel表达式计算引擎

    1.概述 Fel是轻量级的高效的表达式计算引擎. Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过 ...

  7. 【Java】Fel计算引擎学习

    一.前言 最近的项目中,有一个这种需求,系统中配置很多的公式,每个公式中都会有因子.比如:本金*利息,计算的时候,把这两个因子替换掉,如,100*0.01,然后通过java来计算出结果. 二.实现的方 ...

  8. Fel表达式计算引擎

    一.Fel表达式计算引擎介绍 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运算符(+ ...

  9. 【Janino】Janino Java表达式计算引擎 案例

    文章目录 1.官方介绍 2.代码示例 1.官方介绍 当Apache Spark.Apache Flink.Presto为了加速数据处理速度,而使用"代码生成"技术时,都不约而同的选 ...

最新文章

  1. Android之创建简单的ProgressDialog
  2. Oracle基本查询
  3. HTML显示xml中的CDATA内容
  4. Java操作ftp,上传,下载,删除操作
  5. 【原创】请避免GO语言中的携程空跑(CPU突然激增)
  6. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)
  7. Python Web开发框架Django
  8. Oracle 11g R2 软件下载网址收藏
  9. c语言系统垃圾清理软件,清理系统垃圾
  10. ubuntu22.04安装网易云音乐不能打开的问题
  11. mysql frm 修复_使用mysqlfrm恢复frm表结构
  12. python微信发红包看照片_微信发原图会泄露位置信息?用Python教你通过图片获取用户信息!...
  13. 2022-2028年中国工业机器人行业产销需求预测与转型升级分析报告
  14. 华为语音合成服务,为用户提供实时、可替换、多音调的语音播放体验
  15. MVCC能保证不产生幻读吗
  16. Python爬虫-数据类型高级
  17. ESP32 之 ESP-IDF 教学(十八)—— 组件配置(KConfig)
  18. 如何手动创建 k8s kubeconfig 文件以实现多环境切换
  19. linux小红帽实验心得,《小红帽》读后感读书心得400字五篇
  20. 记录--uniapp开发安卓APP视频通话模块初实践

热门文章

  1. 基于Java Swing 的万年历
  2. [论文总结] 美国造林业过去30年的惊人变化
  3. 基金操作术语与收益术语
  4. 华为Mate30EPro参数配置
  5. 《拖延心理学》与时间管理
  6. Freemarker生成HTML静态页面
  7. 4g+uim卡是什么卡_从 2G 到 4G,中国电信天翼 UIM 手机卡图赏
  8. Android进入本地文件管理器及不同文件查看
  9. 批处理脚本重启资源管理器
  10. tif格式怎么转jpg,tif转jpg步骤