三元运算符 (Ternary Operator)
你可以在表达式中使用三元运算符来执行 if-then-else 条件逻辑。以下是一个最基本的示例:
java
String falseString = parser.parseExpression(
"false ? 'trueExp' : 'falseExp'").getValue(String.class);kotlin
val falseString = parser.parseExpression(
"false ? 'trueExp' : 'falseExp'").getValue(String::class.java)在这个例子中,布尔值 false 会导致返回字符串值 'falseExp'。下面是一个更贴近现实的示例:
java
parser.parseExpression("name").setValue(societyContext, "IEEE");
societyContext.setVariable("queryName", "Nikola Tesla");
String expression = "isMember(#queryName) ? #queryName + ' is a member of the ' " +
"+ name + ' Society' : #queryName + ' is not a member of the ' + name + ' Society'";
String queryResultString = parser.parseExpression(expression)
.getValue(societyContext, String.class);
// queryResultString = "Nikola Tesla is a member of the IEEE Society"kotlin
parser.parseExpression("name").setValue(societyContext, "IEEE")
societyContext.setVariable("queryName", "Nikola Tesla")
val expression = "isMember(#queryName) ? #queryName + ' is a member of the ' " +
"+ name + ' Society' : #queryName + ' is not a member of the ' + name + ' Society'"
val queryResultString = parser.parseExpression(expression)
.getValue(societyContext, String::class.java)
// queryResultString = "Nikola Tesla is a member of the IEEE Society"关于三元运算符更简洁的语法,请参阅下一节关于 Elvis 运算符 的说明。
补充教学
1. 短路评估 (Short-circuit Evaluation)
SpEL 的三元运算符遵循与 Java 相同的 短路原则。
- 如果条件为
true,则只计算并执行“真”分支的表达式。 - 如果条件为
false,则只计算并执行“假”分支。 这在某些分支可能涉及空指针风险或耗时操作时非常有用。
2. 在 @Value 属性注入中的妙用
三元运算符最常出现在配置文件中,用于根据环境变量提供备用值:
java
@Value("#{systemProperties['os.name'].contains('Windows') ? 'C:/temp' : '/tmp'}")
private String tempPath;3. 类型自动推断
SpEL 会尝试推断两个分支结果的共同父类型。例如,一个分支返回 Integer,另一个返回 Double,SpEL 可能会将结果统一评估为 Number 或执行必要的类型转换。
4. 可读性陷阱:嵌套三元运算
虽然 SpEL 支持嵌套三元运算符(如 a ? b : (c ? d : e)),但由于 SpEL 表达式通常写在字符串中,缺乏 IDE 的颜色高亮和自动缩进,嵌套过深会导致维护极其困难。 建议:如果逻辑过于复杂,请考虑将逻辑封装在 Java 方法中,然后通过 SpEL 调用该方法。
5. 与 Java 三元运算符的区别
SpEL 表达式的三元运算符在字符串中使用,因此你需要格外注意引号的嵌套。
- Java 中:
boolean ? "string" : "other" - SpEL 中:
"boolean ? 'string' : 'other'"注意外层双引号与内层单引号的搭配,这是初学者最容易出错的地方。