算数运算表达式
SpEL支持加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算。
| 类型 | 示例 |
| — | — |
| 加减乘除 | int result1 = parser.parseExpression(“1+2-3*4/2”).getValue(Integer.class);//-3 |
| 求余 | int result2 = parser.parseExpression(“4%3”).getValue(Integer.class);//1 |
| 幂运算 | int result3 = parser.parseExpression(“2^3”).getValue(Integer.class);//8 |
SpEL还提供求余(MOD)和除(DIV)而外两个运算符,与“%”和“/”等价,不区分大小写。
关系表达式
等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=),区间(between)运算。
如parser.parseExpression("1>2").getValue(boolean.class);
将返回false;
而parser.parseExpression("1 between {1, 2}").getValue(boolean.class);
将返回true。
between运算符右边操作数必须是列表类型,且只能包含2个元素。第一个元素为开始,第二个元素为结束,区间运算是包含边界值的,即 xxx>=list.get(0) && xxx<=list.get(1)
。
SpEL同样提供了等价的“EQ” 、“NE”、 “GT”、“GE”、 “LT” 、“LE”来表示等于、不等于、大于、大于等于、小于、小于等于,不区分大小写。
@Test
public void test3() {
ExpressionParser parser = new SpelExpressionParser();
boolean v1 = parser.parseExpression(“1>2”).getValue(boolean.class);
boolean between1 = parser.parseExpression(“1 between {1,2}”).getValue(boolean.class);
System.out.println(“v1=” + v1);
System.out.println(“between1=” + between1);
}
输出
v1=false
between1=true
逻辑表达式
且(and或者&&)、或(or或者||)、非(!或NOT)。
@Test
public void test4() {
ExpressionParser parser = new SpelExpressionParser();
boolean result1 = parser.parseExpression(“2>1 and (!true or !false)”).getValue(boolean.class);
boolean result2 = parser.parseExpression(“2>1 && (!true || !false)”).getValue(boolean.class);
boolean result3 = parser.parseExpression(“2>1 and (NOT true or NOT false)”).getValue(boolean.class);
boolean result4 = parser.parseExpression(“2>1 && (NOT true || NOT false)”).getValue(boolean.class);
System.out.println(“result1=” + result1);
System.out.println(“result2=” + result2);
System.out.println(“result3=” + result3);
System.out.println(“result4=” + result4);
}
输出
result1=true
result2=true
result3=true
result4=false
字符串连接及截取表达式
使用“+”进行字符串连接,使用“‘String’[0] [index]”来截取一个字符,目前只支持截取一个,如“'Hello ’ + ‘World!’”得到“Hello World!”;而“‘Hello World!’[0]”将返回“H”。
三目运算
三目运算符 **“表达式1?表达式2:表达式3”**用于构造三目运算表达式,如“2>1?true:false”将返回true;
Elivis运算符
Elivis运算符**“表达式1?:表达式2”**从Groovy语言引入用于简化三目运算符的,当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2,简化了三目运算符方式“表达式1? 表达式1:表达式2”,如“null?:false”将返回false,而“true?:false”将返回true;
正则表达式
使用“str matches regex,如“‘123’ matches ‘\d{3}’”将返回true;
括号优先级表达式
使用“(表达式)”构造,括号里的具有高优先级。
类相关表达式
类类型表达式
使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,“java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。
具体使用方法如下:
@Test
public void testClassTypeExpression() {
ExpressionParser parser = new SpelExpressionParser();
//java.lang包类访问
Class result1 = parser.parseExpression(“T(String)”).getValue(Class.class);
System.out.println(result1);
//其他包类访问
String expression2 = “T(com.javacode2018.spel.SpelTest)”;
Class value = parser.parseExpression(expression2).getValue(Class.class);
System.out.println(value == SpelTest.class);
//类静态字段访问
int result3 = parser.parseExpression(“T(Integer).MAX_VALUE”).getValue(int.class);
System.out.println(result3 == Integer.MAX_VALUE);
//类静态方法调用
int result4 = parser.parseExpression(“T(Integer).parseInt(‘1’)”).getValue(int.class);
System.out.println(result4);
}
输出
class java.lang.String
true
true
1
对于java.lang包里的可以直接使用“T(String)”访问;其他包必须是类全限定名;可以进行静态字段访问如“T(Integer).MAX_VALUE”;也可以进行静态方法访问如“T(Integer).parseInt(‘1’)”。
类实例化
类实例化同样使用java关键字“new”,类名必须是全限定名,但java.lang包内的类型除外,如String、Integer。
@Test
public void testConstructorExpression() {
ExpressionParser parser = new SpelExpressionParser();
String result1 = parser.parseExpression(“new String(‘路人甲java’)”).getValue(String.class);
System.out.println(result1);
Date result2 = parser.parseExpression(“new java.util.Date()”).getValue(Date.class);
Sy