Elvis运算符

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

String name = "埃尔维斯·普雷斯利";
String displayName = (name != null ? name : "未知");

相反,您可以使用Elvis运算符(以埃尔维斯的发型为名)。以下示例展示了如何使用Elvis运算符:

  • Java

  • Kotlin

ExpressionParser parser = new SpelExpressionParser();

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

val name = parser.parseExpression("name?:'未知'").getValue(Inventor(), String::class.java)
println(name)  // '未知'
SpEL Elvis运算符还检查字符串,除了null对象。因此,原始代码片段仅接近模拟运算符的语义(需要额外的!name.isEmpty()检查)。

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

  • Java

  • Kotlin

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

Inventor tesla = new Inventor("尼古拉·特斯拉", "塞尔维亚");
String name = parser.parseExpression("name?:'埃尔维斯·普雷斯利'").getValue(context, tesla, String.class);
System.out.println(name);  // 尼古拉·特斯拉

tesla.setName("");
name = parser.parseExpression("name?:'埃尔维斯·普雷斯利'").getValue(context, tesla, String.class);
System.out.println(name);  // 埃尔维斯·普雷斯利
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadOnlyDataBinding().build()

val tesla = Inventor("尼古拉·特斯拉", "塞尔维亚")
var name = parser.parseExpression("name?:'埃尔维斯·普雷斯利'").getValue(context, tesla, String::class.java)
println(name)  // 尼古拉·特斯拉

tesla.setName("")
name = parser.parseExpression("name?:'埃尔维斯·普雷斯利'").getValue(context, tesla, String::class.java)
println(name)  // 埃尔维斯·普雷斯利

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

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

如果定义了系统属性pop3.port,则将其注入;否则注入25。