概念︰MVEL 基礎知識
語法
MVEL 是 Java 型應用程式的一種運算式語言。其語法與 Java 類似,但新增了一些功能,可提高比對內容的效率。
注意︰
- 中小型虛擬教學項目使用 Java 名稱空間和類別,但兩者本身都無法聲明。
- 與 Java 不同的是,MVEL 是動態類型的,具有可選的類型。
- 中部實際值水準運算式可以是單行陳述式,也可以是多行指令碼。若為多行指令碼,請使用分號分隔每個陳述式。
- 最小平均價值支出 (MVEL) 依據「最後輸出價值」的原則運作。它支援return關鍵字,但通常不需要。
- 最佳作業作業限位 (mover) 支援運算子優先順序規則,並使用括弧來控制執行順序。
- 您可以將 MVEL 字串常值放在單引號或雙引號中。
- 分號是 MVEL 中的保留字元。無法在運算式中使用。使用(char) 59。範例︰props['string']='a;b'引發錯誤。此代碼不會︰props['string']= (char) 59 props['string_new']='a'props['string']'b'
MVEL 運算式可包含︰
- 布林運算式
- 方法呼叫
- 屬性運算式
- 變數指派
簡單 MVEL 屬性運算式的範例︰
context.errorMessage
其會擷取屬性
errorMessage
從變數或環境定義物件 context
。MVEL 支援所有常見的 Java 比較運算子、數學運算子和邏輯運算子。下表匯總了其他重要的 MVEL 運算子︰
運算子 | 說明 | 範例 |
|---|---|---|
new
| 實例化物件。 | new String("foo")
|
with
| 在單一物件實例上執行多個作業。 | with (value) { name = 'Foo', age = 50, sex = Sex.MALE }
|
assert
| 判斷值為 True 或執行失敗並產生 AssertionError。 | assert foo != null
|
contains
| 判斷左側的值是否包含右側的值。 | var contains "Foo"
|
is 或 instance of
| 判斷左側的值是否是右側類別的成員。 | var instanceof String
|
strsim
| 比較字串並傳回以百分比表示的相似度。 | "foobol" strsim "foobar"
|
soundslike
| 在 2 個字串之間執行 roundex 比較。 | "foobar" soundslike "fubar"
|
&
| 執行位元 AND 運算。 | foo & 5
|
|
| 執行位元 OR 運算。 | foo | 5
|
^
| 執行位元 XOR 運算。 | foo ^ 5
|
+
| 用於串連 2 個字串的重載運算子。 | "foo" + "bar"
|
#
| 以字串的形式串連 2 個常值。 | 8 # 9
|
in
| 檢查集合內的物件。 | (foo in list)
|
=
| 將值指派給變數。 | var = "foobar"
|
值測試
在 Java 中,運算子
==
檢查參照是否指向同一個物件。但是,在 MVEL 中,比較運算子 ==
檢查值是否相等。MVEL 運算式 foo == 'bar'
相當於 Java 的 foo.equals("bar")
。MVEL 布林運算式的範例︰
user.name == 'John Smith'
傳回
true
如果 name
變數或環境定義物件的屬性 user
是 John Smith。MVEL 使用類型強制轉換。如果您比較 2 個不同類型的值,則 MVEL 會嘗試將右側的值強制轉換為左側的類型。如果無法這麼做,系統會嘗試將左側的值強制轉換為右側的類型。範例︰
"123" == 123;
此運算式傳回
true
因為 MVEL 會在執行比較前,將右側的值強制轉換為字串。清單、對應和陣列
請在方括號內加上最小化作業最低薪資清單。使用逗號分隔項目。範例︰
["Paris", "London", "Berlin"]
請在方括號中加上 MVEL 對應。使用冒號分隔索引鍵和值。範例︰
["Foo" : "Bar", "Bar" : "Foo"]
請將 MVEL 陣列放在大括號中。使用逗號分隔項目。範例︰
{"Bill", "Bob", "Ben"}
屬性瀏覽
MVEL 提供了單一、統一的語法,可用來存取屬性、靜態欄位、清單、對應和陣列。
在 Java 中,您可以使用以下陳述式從物件存取屬性︰
context.getException().getCause()
在 MVEL 中,您可以使用以下運算式來存取相同的屬性︰
context.exception.cause
以相同方式存取清單和陣列。範例︰
parts[2]
存取對應圖的方式與存取陣列的方式相同,但可以將任何物件做為索引值傳遞。範例︰
props["foobar"]
如果對應使用字串做為索引鍵,您可以將該對應本身視為虛擬物件。範例︰
props.foobar
出於編入索引的目的,MVEL 會將字串視為陣列。
此範例傳回
B
︰foo = "Berlin"; foo[0];
指派
您可以在 MVEL 運算式中指派變數,以便在運算式中使用或在執行階段擷取。
由於 MVEL 是動態類型語言,因此您在聲明新變數時不需要指定類型。但您可以這麼做。
以下兩個範例在 MVEL 中皆適用︰
str = "Some string"; String str = "Some string";
將值指派給類型化變數時,MVEL 會嘗試執行自動類型轉換。範例︰
String num = 1;
您可以將動態類型變數的值轉換為另一種類型。範例︰
String num = 1;
區段︰輸入和強制轉換
中虛擬實際語言學習清單使用動態類型,以及選用的靜態類型。本機 Java 物件是靜態類型的。為與這些元素互動, MVEL 有時必須執行類型強制轉換,這可能會影響效能。
中部實際值清單 (MVEL) 會自動將類型強制轉換為最適合目前值的類型。這表示您在處理數字時必須謹慎。浮點運算中可能會發生錯誤,因為 MVEL 會自動放棄無限精度
java.math.BigDecimal
至 java.lang.Double
和 java.lang.Long
。當儲存值的類型不是您預期的類型時,這可能會導致問題。一般而言,您應避免對 MVEL 中的財務值執行非整數算術。MVEL 的類型強制轉換錶示您可以在不調整輸入的情況下呼叫 Java 方法。解釋器或編譯器會分析您要傳遞給方法的類型,並決定需要何種強制轉換。
如果陣列類型發生衝突,則 MVEL 會嘗試將整個陣列強制轉換為所需的輸入類型。
MVEL 會對靜態類型變數執行任何必要的強制轉換,前提是指派的值是可強制轉換的。如果不是,則會發生例外狀況。