您好,登錄后才能下訂單哦!
本文章向大家介紹如何在Java項目中運行字符串表達式的基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。
Java的特點有哪些 1.Java語言作為靜態面向對象編程語言的代表,實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。 2.Java具有簡單性、面向對象、分布式、安全性、平臺獨立與可移植性、動態性等特點。 3.使用Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。
基本用法介紹
字符串表達式通過一個叫 RunnerUtil 的靜態類運行,可以直接運行得到表達式結果,也可以解析一個表達式后在需要的時候運行,RunnerUtil 主要有以下幾個方法:
RunnerUtil.run(/* expression */); 直接運行表達式并得到結果; RunnerUtil.run("1 + 1"); // 2 RunnerUtil.run(" 'Hello' + ' ' + 'World!' "); // "Hello World!" RunnerUtil.run(/* expression */, / * data */); 運行含有變量的表達式,后面的 data 是變量將要指向的“值”; RunnerUtil.parseRun(/* expression */); 直接運行“另一種”表達式,并得到結果,如: RunnerUtil.parseRun("Hello {{ 'World!' }}"); // "Hello World!"
可見 #parseRun 是運行包含“插值語法”的表達式,被包裹的內容被作為一個表達式單獨運行;
字符串中可以包含多個插值語法表達式,但不能嵌套和交叉,也可以運行含有變量的表達式。
Runner runner = RunnerUtil.parse(/* expression */);
解析一個字符串表達式,得到一個“字符串表達式運行器” —— Runner,然后調用其 run(/ * data */) 方法運行并得到結果。
語法及運算詳細介紹
作為一個具有一定“語言特點”的東西,它定義了一些自己的語法、數據類型、運算類型等,但大部分都與 Java 和 JavaScript 兼容,相同符號具有相同或相似的語言意義。
數據類型:
1、null:這是一個關鍵字,但因為它符合和變量的定義規則,所以需要注意一下,同樣被定義為關鍵字的還有 true 和 false。
2、boolean:true 和 false
RunnerUtil.run(" null "); // null RunnerUtil.run(" true "); // true RunnerUtil.run("false"); // false // 表達式中多余的空格自動忽略
數字:這里面的數字統一采用 Java 里的 int 和 double 型數據,直接參與運算的也只有是這兩種類型,區別就是有沒有小數點。
RunnerUtil.run(" 12 "); // 12 RunnerUtil.run(" 12.5 "); // 12.5 // 表示數字必須是連續,中間不能有空格的 // 否則將拋出異常,如 RunnerUtil.run(" 12. 5"); // 異常 RunnerUtil.run(" 1 2 "); // 異常
表示數字的字符之間應該是連續的,如:25、36.9 等;如果是不連續的會拋出異常,如:2 5、36 .9 等;
字符串:Java 里的字符串用雙引號包裹,在這里還將表示字符的單引號“征用”,雙引號單引號包裹的都表示普通字符串的直接值,這樣做也是為了書寫方便(與 JavaScript 相似),同時也就沒有了 char 類型數據啦啦啦……
RunnerUtil.run(" 'abcdef' "); // "abcdef" RunnerUtil.run(" \"abcdef\" "); // "abcdef" RunnerUtil.run(" 'abc def' "); // "abc def"
List:實際上是 ArrayList,對應 JavaScript 里面的數組。Java 的數組也對應 JavaScript 數組。
RunnerUtil.run(" { } "); // 總是返回一個空ArrayList RunnerUtil.run(" {1,2,,4, } "); // 總是返回一個包含:1、2、null、4 這幾項的 ArrayList // 可以看出最后一個逗號之后如果是結束符號會自動忽略 // 中間的逗號與逗號之間若沒有其他非空白符號會插入一個 null 值
Map:實際上是 HashMap,對應 JavaScript 里的對象。同樣對應 JavaScript 對象的還有普通 POJO。
Map 對應的是 JavaScript 里的對象,但是在這里 Map 的鍵可以是這些數據類型:
null、true / false、數字(int / double)、字符串,不能再是其他 Java 對象了
RunnerUtil.run(" {:} "); // 總是返回一個空 HashMap, // 注意與空 List 的異同,都是用花括號表示 // 但空 Map 里面需要有一個冒號,否則就是 List RunnerUtil.run(" {key: 'value'}"); // 總是返回包含一個鍵值對的 HashMap // 可以看出,對象的鍵名是字符串的話可以不用引號包裹 // 但是值必須被包裹 RunnerUtil.run(" {true: 'value'}"); // 鍵是 true /* * 這里的 true 不是字符串,而是 boolean。 * 同樣,未被引號包裹的 null、false、數字都是對應類型的數據,而不是字符串 * 其他符合變量命名規則的鍵都是普通字符串,被單引號或雙引號包裹的也是 */ RunnerUtil.run(" {'true': 'value', 25: false, 'name': \"張三\"}");
運算支持的類型:
普通四則混合運算:+、-、*、/、%、() RunnerUtil.run(" 1 + 1 "); // 2 RunnerUtil.run(" 1 + (3 * 4)) "); // 13 RunnerUtil.run(" 'Hello ' + \"World!\" "); // "Hello World!" RunnerUtil.run(" true + false "); // "truefalse" /* * true+false 在 Java 中是不允許的 * 但如果是“+”運算的話,這里均作為普通字符串; * 相當于調用了 toString 方法 */ 位運算:&、|、^、<<、>> RunnerUtil.run(" 1 ^ 1 "); RunnerUtil.run(" 1 & 1 "); RunnerUtil.run(" 1 | 1 "); RunnerUtil.run(" 1 << 1 "); RunnerUtil.run(" 1 >> 1 "); 比較運算:>、>=、==、<=、< RunnerUtil.run(" 1 + 1 == 2 "); // true RunnerUtil.run(" 1 + 1 < 2 "); // false 邏輯運算:&&、||、! RunnerUtil.run("1+1==2 && 5 > 4"); // true 變量:命名規則與 Java 變量命名規則相同,同時 null、true、false 不能作為變量 表達式中包含變量就代表這個表達式在運行得到結果時需要從外部獲取數據,如果不能正確的從數據源讀取到數據,運行就會拋出異常; RunnerUtil.run(" 'Hello, ' + name "); // 拋出異常 Map data = new HashMap(); data.put("name", "Li Lei!"); RunnerUtil.run(" 'Hello, ' + name ", data); // "Hello, Li Lei!"
鏈式取值:鏈式語法與 JavaScript 很相似
HashMap data = new HashMap(); ArrayList list = new ArrayList(); list.add(true); list.add(false); list.add(25); list.add('隔壁老王'); HashMap map = new HashMap(); map.put("name", "小四"); map.put("index", 2); map.put(true, "true 是 Boolean 類型作為鍵"); data.put("list", list); data.put("map", map); RunnerUtil.run("map.name", data); // "小四" RunnerUtil.run("map['name']", data); // "小四" (也可以這樣取值) RunnerUtil.run("list[ 2 ]", data); // 25 (索引取值需要用方括號包裹) RunnerUtil.run("list[3]", data); // "隔壁老王" (索引取值需要用方括號包裹) RunnerUtil.run("list[map.index]", data); // 25 // (這是高級點的用法,方括號包含另一個表達式 // 返回值是一個索引,然后返回索引指向的值) RunnerUtil.run("[true]", data); // "true 是 Boolean 類型作為鍵" // 如果不用方括號包括,true 就是一個直接值,返回 true // 那么問題來了: // 如果傳入的數據不是 Map 或 POJO,而是 List 或數組怎么辦呢? RunnerUtil.run(" [1] ", list); // false // 啊……唐宗宋祖,略顯風騷! // 這種鏈式語法與 JavaScript 很相似
運行方法:目前只能運行無參和一個參數的方法,變長參數的方法支持不完善,慎用。
這里的數據 data 繼續用上一條的 data,具體數據不寫了
RunnerUtil.run("map.size()", data); // 3 RunnerUtil.run("map.get('name')", data); // "小四" RunnerUtil.run("map.get('name').length()", data); // 2 RunnerUtil.run("map.name.length()", data); // 2 RunnerUtil.run(" [3].length() ", list); // 4 // 唐宗宋祖,又顯風騷!
運行靜態方法: @ ;運行靜態方法需要用到“@”符號作為標記。目前也不支持多參數方法調用。
當你打開源碼會發現這是一整個獨立的工具庫,很多方法和 commons-lang 包內容相似(個人認為不是重復造輪子,也有很多不同的和不如的)...,運行靜態方法也可以運行這個工具庫內的所有工具方法,暫時未將 RunnerUtil 剝離出來,也還不支持自定義的靜態方法調用,不過這個工具庫所提供的功能
RunnerUtil.run("@System.currentTimeMillis() "); // 15.....(一個毫秒數) RunnerUtil.run("@Objects.toString(25) "); // "25"
以上就是小編為大家帶來的如何在Java項目中運行字符串表達式的全部內容了,希望大家多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。