天天看點

[Mvel]Mvel2.0使用指南一 基礎

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/75244442

MVEL在很大程度上受到Java文法的啟發,作為一個表達式語言,也有一些根本的差別,旨在更高的效率,例如:直接支援集合、數組和字元串比對等操作以及正規表達式。 MVEL用于執行使用Java文法編寫的表達式。

除了表達語言之外,MVEL還可用作配置和字元串構造的模闆語言。

MVEL2.x表達式包含以下部分的内容:

  • 屬性表達式
  • 布爾表達式
  • 方法調用
  • 變量指派
  • 函數定義

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#1-%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95 1. 基本文法

MVEL 是一種基于Java文法,但又有着顯著不同的表達式語言。與Java不同的是,MVEL是動态類型語言(可選類型),意味着源代碼中不需要類型限定。MVEL解釋器可以作為下載下傳庫內建到其他産品中。 它需要從maven網站下載下傳。這些庫展現了API。如果一個表達式傳遞給庫的接口,則表達式被計算并提供計算後的結果。

MVEL表達式可以像單個辨別符一樣簡單,或者與使用方法調用和内聯集合建立的完整布爾表達式一樣複雜。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#11-%E7%AE%80%E5%8D%95%E5%B1%9E%E6%80%A7%E8%A1%A8%E8%BE%BE%E5%BC%8F 1.1 簡單屬性表達式

user.name           

在這個表達式中,我們隻需要一個唯一的辨別符

user.name

,它們本身就是我們在MVEL中引用的屬性表達式,表達式的唯一目的是從一個變量中提取一個屬性或者上下文對象。 屬性表達式是最常見的用途之一,允許将MVEL用作非常高性能,易于使用的反射優化器。

MVEL甚至可以用于執行布爾表達式:

user.name == 'John Doe'           

像Java一樣,MVEL支援全部的運算符優先級規則,包括使用括号來控制執行順序:

(user.name == 'John Doe') && ((x * 2) - 1) > 20           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#12-%E5%A4%9A%E8%AF%AD%E5%8F%A5 1.2 多語句

可以編寫具有任意數量語句的腳本,使用分号來表示一個語句的終止。隻有一個語句,或在腳本中的最後一個語句的情況下,可以不用使用分号。

statement1; statement2; statement3           

備注

第三個語句可以不使用分号,因為是腳本中的最後一個語句;注意的是不能另起新行來表示上一行語句的結束;

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#13-%E8%BF%94%E5%9B%9E%E5%80%BC 1.3 傳回值

MVEL表達式使用

最後值輸出原則

(a last value out principle)。這意味着雖然MVEL支援return關鍵字,但可以不使用它。 例如:

a = 10;
b = (a = a * 2) + 10;
a;           

在這個上面的例子中,表達式傳回了a的值,因為其是表達式的最後一個值。 它在功能上與以下相同:

a = 10;
b = (a = a * 2) + 10;
return a;           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#2-%E5%80%BC%E6%A0%A1%E9%AA%8Cvalue-tests 2. 值校驗(Value Tests)

MVEL中的所有等式校驗均基于值而不是引用。 是以,表達式

foo =='bar'

與Java中的

foo.equals(“bar”)

相當。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#21-empty 2.1 Empty

MVEL提供了一個特殊的字面值,用于校驗一個值是否為""或者null,命名為

empty

a == empty           

如果a的值滿足empty的要求,則示例表達式将為真。

Example:

String expression = "a == empty && b == empty";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("a", "");
paramMap.put("b", null);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // true           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#22-null 2.2 Null

VEL允許使用關鍵字

null

nil

表示一個空值。

a == null;
a == nil; // same as null           
String expression = "a == null && b == nil";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("a", null);
paramMap.put("b", null);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // true           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#23-%E5%80%BC%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2 2.3 值強制類型轉換

MVEL的強制類型轉換系統适用于如下場景:通過試圖将右邊的值強制轉換為左邊值的類型來比較兩個無法比較的類型,反之亦然。

"123" == 123;           

上述表達式在MVEL中傳回

true

,因為強制類型轉換系統将強制将無類型數字123轉換為字元串來執行比較。

String expression = "a == b";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("a", "123");
paramMap.put("b", 123);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // true           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#3-inline-list-maps-and-arrays 3. Inline List, Maps and Arrays

MVEL允許你使用簡單優雅的文法來表示List,Map和Array。 請考慮以下示例:

["Bob" : new Person("Bob"), "Michael" : new Person("Michael")]           

這在功能上等同于以下代碼:

Map map = new HashMap();
map.put("Bob", new Person("Bob"));
map.put("Michael", new Person("Michael"));           

這是在MVEL中表達資料結構的非常強大的方法。您可以在任何地方使用這些結構,甚至作為方法的參數:

something.someMethod(["foo" : "bar"]);           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#31-lists 3.1 Lists

Lists可以使用下列格式表示:

[item1,item2,...]           
["Jim", "Bob", "Smith"]           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#32-maps 3.2 Maps

Maps可以使用下列格式表示:

[key1 : value1, key2: value2, ...]           
["Foo" : "Bar", "Bar" : "Foo"]           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#33-arrays 3.3 Arrays

Arrays可以使用下列格式表示:

{item1, item2, ...}           
{"Jim", "Bob", "Smith"}           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#34-array-coercion 3.4 Array Coercion

要了解的内聯數組的一個重要方面是它們被強制轉換為其他數組類型的特殊能力。 當你聲明一個内聯數組時,它是無類型的,但是例如說你傳遞給接受int []的方法。 您隻需編寫代碼如下:

foo.someMethod({1,2,3,4});           

在這種情況下,MVEL會看到目标方法接受一個int[]參數并自動轉換數組類型。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#4-%E5%B1%9E%E6%80%A7 4. 屬性

MVEL屬性遵循在其他語言(如Groovy,OGNL,EL等)中的bean屬性表達中的完整約定(MVEL property navigation follows well-established conventions found in other bean property expressions found in other languages)。

與需要限定的其他語言不同,MVEL提供了通路屬性,靜态字段,Map等的單一統一文法。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#41-bean-properties 4.1 Bean Properties

大多數Java開發人員熟悉并使用其Java對象中的

getter

/

setter

方法,以便封裝屬性通路。 例如,你可以從對象通路屬性:

user.getManager().getName();           

為了簡化此操作,你可以使用以下表達式通路相同的屬性:

user.manager.name           
Fruit fruit = new Fruit();
fruit.setName("蘋果");

//String expression = "fruit.getName()";
String expression = "fruit.name";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("fruit", fruit);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // 蘋果           

當對象中的字段為public的情況下,MVEL仍然希望通過其getter方法通路該屬性。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#42-null-safe-bean-navigation 4.2 Null-Safe Bean Navigation

有時候,你可能擁有包含空元素的屬性表達式,需要你進行空值檢查。你可以使用空安全運算符來簡化此操作:

user.?manager.name           

這在功能上等同于:

if (user.manager != null) { return user.manager.name; } else { return null; }           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#43-collections 4.3 Collections

集合的周遊也可以使用縮寫文法實作。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#431-list 4.3.1 List

List的通路與數組相同。 例如:

user[5]           

相當于Java代碼:

user.get(5);           
https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#432-map 4.3.2 Map

Map以數組相同的方式通路,除非任意對象可以作為索引值傳遞。 例如:

user["foobar"]           
user.get("foobar");           

對于使用字元串作為key的Map,你可以使用另一種特殊文法:

user.foobar           

...允許你将Map本身視為虛拟對象。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#433-strings-as-arrays 4.3.3 Strings as Arrays

為了使用屬性索引(以及疊代),所有字元串都被視為數組。 在MVEL中,你可以通路String變量中的第一個字元:

foo = "My String";
foo[0]; // returns 'M';           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#5-%E5%AD%97%E9%9D%A2%E5%80%BC 5. 字面值

字面值用于表示特定腳本的源中的固定值(represent a fixed-value in the source of a particular script)。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#51-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E9%9D%A2%E5%80%BC 5.1 字元串字面值

字元串字面值可以用單引号或雙引号表示。

"This is a string literal"
'This is also string literal'           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#52-%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97 5.2 字元串轉義序列

  • \\

     雙重轉義允許在字元串中出現單個反斜杠。
  • \n

     新行
  • \r

     回車
  • \u####

     Unicode字元(示例:\ uAE00)
  • \###

     八進制字元(示例:\ 73)

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#53-%E6%95%B0%E5%80%BC%E5%9E%8B%E5%AD%97%E9%9D%A2%E5%80%BC 5.3 數值型字面值

整數可以十進制(10位),八進制(8位)或十六進制(16位)表示。

十進制整數可以表示為不以零開始的任何數字。

125 // 十進制           

八進制表示為帶有

字首的數字,後跟數字範圍從0到7。

0353 // 八進制           

十六進制表示為帶有

0x

字首的數字,後跟數字範圍為0-9..A-F。

0xAFF0 // 十六進制           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#54-%E6%B5%AE%E7%82%B9%E5%9E%8B%E5%AD%97%E9%9D%A2%E5%80%BC 5.4 浮點型字面值

浮點數由整數部分和由點/周期字元表示的小數部分組成,并具有可選的類型字尾。

10.503 // a double
94.92d // a double
14.5f // a float           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#55-biginteger%E5%92%8Cbigdecimal%E5%AD%97%E9%9D%A2%E5%80%BC 5.5 BigInteger和BigDecimal字面值

你可以使用字尾

B

I

來表示

BigInteger

BigDecimal

字面值(大寫字母是必填字段)。

104.39484B // BigDecimal
8.4I // BigInteger           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#56-boolean-%E5%AD%97%E9%9D%A2%E5%80%BC 5.6 Boolean 字面值

布爾字面值由保留關鍵字

true

false

表示。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#57-null-%E5%AD%97%E9%9D%A2%E5%80%BC 5.7 Null 字面值

Null字面值由保留的關鍵字

null

nil

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#6-%E7%B1%BB%E5%9E%8B%E5%AD%97%E9%9D%A2%E5%80%BC 6. 類型字面值

類型文字與Java中的類似,具有以下格式:

<PackageName>.<ClassName>           

是以一個類可能是被限定為如下:

java.util.HashMap           

或者如果類是通過内聯或外部配置引入的,那麼可以使用其非限定名稱引用它:

HashMap           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#61-%E5%B5%8C%E5%A5%97%E7%B1%BB 6.1 嵌套類

MVEL 2.0中的标準點符号

.

(如Java中)無法通路嵌套類。 相反,你必須使用符号限定這些類。

org.proctor.Person$BodyPart           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#7-%E6%B5%81%E6%8E%A7%E5%88%B6 7. 流控制

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#71-if-then-else 7.1 If-Then-Else

MVEL支援完整的C/Java風格的if-then-else塊。 例如:

if (var > 0) {
   System.out.println("Greater than zero!");
}
else if (var == -1) { 
   System.out.println("Minus one!");
}
else { 
   System.out.println("Something else!");
}           
String expression = "if (param > 0) {return \"Greater than zero!\"; } else if (param == -1) { return \"Minus one!\"; } else { return \"Something else!\"; }";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("param", 2);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // Greater than zero!           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#72-%E4%B8%89%E5%85%83%E5%A3%B0%E6%98%8E 7.2 三元聲明

就像Java一樣,支援三元聲明語句:

num > 0 ? "Yes" : "No";           

和嵌套三元語句:

num > 0 ? "Yes" : (num == -1 ? "Minus One!" : "No")           
String expression = "num > 0  ? \"Yes\" : \"No\";";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("num", new Integer(1));
Object object = eval(expression, paramMap);
System.out.println(object); // Yes           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#73-foreach 7.3 Foreach

MVEL中最強大的功能之一就是

foreach

操作。 它與Java 1.5中的

foreach

運算符的文法和功能類似。它接受由冒号分隔的兩個參數,第一個是目前元素的局部變量,第二個是要疊代的集合或數組。

count = 0;
foreach (name : people) {
   count++;
   System.out.println("Person #" + count + ":" + name);
}
    
System.out.println("Total people: " + count);           

由于MVEL将字元串視為可疊代對象,你可以使用

foreach

塊來疊代字元串(逐字元):

str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

foreach (el : str) {
   System.out.print("["+ el + "]"); 
}           

上面輸出為:

[A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X][Y][Z]           

你還可以使用MVEL計數到一個整數值(從1):

foreach (x : 9) { 
   System.out.print(x);
}           
123456789           

文法注意

從MVEL 2.0開始,可以通過使用

for

關鍵字簡單地簡化foreach,就像在Java 5.0中一樣。 例如:

for (item : collection) { ... }           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#74-for%E5%BE%AA%E7%8E%AF 7.4 For循環

MVEL 2.0實作标準C 

for

循環:

for (int i =0; i < 100; i++) { 
   System.out.println(i);
}           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#75-do-while-do-until 7.5 Do While, Do Until

在MVEL中實作了

do while

do until

,遵循與Java相同的約定,帶有

until

的與

while

相反。

do { 
   x = something();
} 
while (x != null);           

...在語義上相當于...

do {
   x = something();
}
until (x == null);           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#75-while-until 7.5 While, Until

MVEL 2.0實作标準的

while

,以及相反的

until

while (isTrue()) {
   doSomething();
}           

或者

until (isFalse()) {
   doSomething();
}           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#8-%E6%8A%95%E5%BD%B1%E4%B8%8E%E6%8A%98%E5%8F%A0 8. 投影與折疊

簡單地說,投影是表示集合的一種方式。可以使用非常簡單的文法,檢查集合中非常複雜的對象模型。

想像你有一個User對象的集合。 這些對象中的每一個都有一個

Parent

。 現在,你想要在使用者層次結構中擷取父目錄的所有名稱(假設Parent類有一個

name

字段),你将會寫下如下内容:

parentNames = (parent.name in users);           

甚至可以執行嵌套操作。想象一下,User對象有一個名為

familyMembers

的成員集合,我們想要一個所有家庭成員名稱的清單:

familyMembers = (name in (familyMembers in users));           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#9-%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC 9. 變量指派

MVEL允許你可以在表達式中指派變量,運作時可以提取使用,或在表達式中直接使用。

由于MVEL是一種動态類型的語言,你不需要指定一個類型來聲明一個新的變量。 但是,你可以選擇這樣做。

str = "My String"; // valid
String str = "My String"; // valid           

然而,與Java不同,MVEL在為類型變量指派時提供了自動類型轉換(如果可能的話)。 例如:

String num = 1;
assert num instanceof String && num == "1";           

對于動态類型變量,如果你隻想執行類型轉換,你可以簡單地将該值轉換為所需的類型:

num = (String) 1;
assert num instanceof String && num == "1";           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#10-%E6%96%B9%E6%B3%95%E5%AE%9A%E4%B9%89 10. 方法定義

MVEL允許使用

def

function

關鍵字定義native函數。

函數按聲明的順序定義,不能前言引用。 唯一的例外是在函數本身中,可以直接引用另一個函數。

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#101-%E7%AE%80%E5%8D%95%E7%A4%BA%E4%BE%8B 10.1 簡單示例

定義一個簡單的函數:

def hello() { System.out.println("Hello!"); }           

這定義了一個名為“hello”的簡單函數,它不接受任何參數。調用該函數時列印

你好!

到控制台.MVEL定義的函數像任何正常方法調用一樣工作。

hello(); // calls function           
String expression = "def hello() { return \"Hello!\"; } hello();";
Map<String, Object> paramMap = Maps.newHashMap();
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // Hello!           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#102-%E6%8E%A5%E5%8F%97%E5%8F%82%E6%95%B0%E5%B9%B6%E8%BF%94%E5%9B%9E%E5%80%BC 10.2 接受參數并傳回值

函數可以被聲明為接受參數,并且可以傳回單個值。如下示例:

def addTwo(a, b) { 
   a + b;
}           

該函數将接受兩個參數(a和b),然後将兩個變量相加。 由于MVEL使用最終值退出原則,是以傳回最終結果值。是以,你可以使用以下功能:

val = addTwo(5, 2);
assert val == 10;           

return

關鍵字也可用于強制從函數的内部程式流程中傳回值。

String expression = "def addTwo(num1, num2) { num1 + num2; } val = addTwo(a, b);";
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("a", 2);
paramMap.put("b", 4);
Object object = MVEL.eval(expression, paramMap);
System.out.println(object); // 6           

https://note.youdao.com/md/preview/preview.html?file=%2Fyws%2Fapi%2Fpersonal%2Ffile%2FWEBf57ef1f0bc267291de8d7f774dc00b02%3Fmethod%3Ddownload%26read%3Dtrue#103-closures 10.3 Closures

MVEL允許Closures。 但是,該功能不能與本地Java方法互操作。

// define a function that accepts a parameter    
def someFunction(f_ptr) { f_ptr(); }

// define a var
var a = 10;

// pass the function a closure
someFunction(def { a * 10 });           

原文:

https://en.wikibooks.org/wiki/Transwiki:MVEL_Language_Guide#Language_Guide_for_2.0