Skip to content

三元运算符 (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'" 注意外层双引号与内层单引号的搭配,这是初学者最容易出错的地方。

Based on Spring Framework.