1. 程式人生 > >spring: 在表達式中使用類型

spring: 在表達式中使用類型

size 歌曲 想要 ngs ebo 任務 目標 新的 集合

如果要在SpEL中訪問類作用域的方法和常量的話,要依賴T()這個關鍵的運算符。例如,為了在SpEL中表達Java的Math類,需要按照如下的方式使用T()運算符:

T{java.lang.Math}

這裏所示的T()運算符的結果會是一個Class對象,代表了java.lang.Math。如果需要的話,我們甚至可以將其裝配到一個Class類型的bean屬性中。但是T()運算符的真正價值在於它能夠訪問目標類型的靜態方法和常量。

例如,假如你需要將PI值裝配到bean屬性中。如下的SpEL就能完成該任務:

T{java.lang.Math}.random()

SpEL還提供了三元運算符(ternary),它與Java中的三元運算符非常類似。例如,如下的表達式會判斷如果scoreboard.score>1000的話,計算結果為String類型的“Winner!”,否則的話,結果為Loser:

#{scoreboard.score > 100 ? "Winner" : "Loser}

三元運算符的一個常見場景就是檢查null值,並用一個默認值來替代null。例如,如下的表達式會判斷disc.title的值是不是null,如果是null的話,那麽表達式的計算結果就會是“Rattleand Hum”:

#{disc.title ? "Rattleand hum"}

SpEL還提供了查詢運算符(.?[]),它會用來對集合進行過濾,得到集合的一個子集。作為闡述的樣例,假設你希望得到jukebox中artist屬性為Aerosmith的所有歌曲。如下的表達式就使用查詢運算符得到了Aerosmith的所有歌曲:

#{jukebox.songs.?[artist eq ‘Aerosmith‘ ]}

SpEL還提供了另外兩個查詢運算符:“.^[]”和“.$[]”,它們分別用來在集合中查詢第一個匹配項和最後一個匹配項。例如,考慮下面的表達式,它會查找列表中第一個artist屬性為Aerosmith的歌曲:

#{jukebox.songs.^[artist eq ‘Aerosmith‘ ]}

最後,SpEL還提供了投影運算符(.![]),它會從集合的每個成員中選擇特定的屬性放到另外一個集合中。作為樣例,假設我們不想要歌曲對象的集合,而是所有歌曲名稱的集合。如下的表達式會將title屬性投影到一個新的String類型的集合中:

#{jukebox.songs.![title]}

實際上,投影操作可以與其他任意的SpEL運算符一起使用。比如,我們可以使用如下的表達式獲得Aerosmith所有歌曲的名稱列表:

#{jukebox.songs.?[artist eq ‘Aerosmith‘ ].![title]}

註意點:

(1)查詢集合有三種符號

.?[ ] 返回一個集合

.^[ ]返回集合的第一個對象

.$[ ]返回集合的最後一個對象

(2)影射元素集合符號

.![ ] 返回一個集合

(3)在查詢元素的時候,我們可以引入對比符來對比某種屬性,例如:cakes.$[size > 6]

(4)影射元素集合的時候,中括號裏面放入的是集合裏面某個元素的某個屬性,返回的就是集合裏面所有元素的這個屬性的集合

spring: 在表達式中使用類型