The Elvis Operator

Elvis 运算符是三元运算符语法的缩写,用于 Groovy 语言中。使用三元运算符语法,您通常必须重复变量两次,如下例所示:

String name = "Elvis Presley";
String displayName = (name != null ? name : "Unknown");

相反,可以使用 Elvis 操作符(以其对 Elvis 发型相似性的命名而来)。以下示例展示了如何使用 Elvis 操作符:

  • Java

  • Kotlin

ExpressionParser parser = new SpelExpressionParser();

String name = parser.parseExpression("name?:'Unknown'").getValue(new Inventor(), String.class);
System.out.println(name);  // 'Unknown'
val parser = SpelExpressionParser()

val name = parser.parseExpression("name?:'Unknown'").getValue(Inventor(), String::class.java)
println(name)  // 'Unknown'

SpEL Elvis 运算符除了 null 对象外还检查 empty 字符串。因此原始代码段仅仅接近模拟运算符的语义(它需要一个附加的 !name.isEmpty() 检查)。

以下清单展示了更复杂的示例:

  • Java

  • Kotlin

ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();

Inventor tesla = new Inventor("Nikola Tesla", "Serbian");
String name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name);  // Nikola Tesla

tesla.setName("");
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String.class);
System.out.println(name);  // Elvis Presley
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()

val tesla = Inventor("Nikola Tesla", "Serbian")
var name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name)  // Nikola Tesla

tesla.setName("")
name = parser.parseExpression("name?:'Elvis Presley'").getValue(context, tesla, String::class.java)
println(name)  // Elvis Presley

可以在表达式中使用 Elvis 操作符来应用默认值。以下示例展示了如何在 @Value 表达式中使用 Elvis 操作符:

@Value("#{systemProperties['pop3.port'] ?: 25}")

如果定义了系统属性 pop3.port,则会注入该属性,否则注入 25。