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