此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.6spring-doc.cadn.net.cn

猫王作员

Elvis 运算符 (?:) 是三元运算符语法的缩写,用于 Groovy 语言。使用 三元运算符语法,您通常必须将变量重复两次,如下面的 Java 示例显示:spring-doc.cadn.net.cn

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

相反,您可以使用 Elvis 运算符(因与 Elvis 的发型相似而命名)。 以下示例演示如何在 SPEL 表达式中使用 Elvis 运算符:spring-doc.cadn.net.cn

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 运算符还将empty String 视为null对象。因此, 原始的 Java 示例仅接近于模拟运算符的语义:它将 需要使用name != null && !name.isEmpty()作为谓词,以便与 SpEL Elvis 运算符的语义。spring-doc.cadn.net.cn

从 Spring Framework 7.0 开始,SpEL Elvis 运算符支持java.util.Optional跟 透明的 unwrapping 语义。spring-doc.cadn.net.cn

例如,给定表达式A ?: B如果Anullempty Optional, 表达式的计算结果为B.但是,如果A是非空的Optional表达式 计算结果为Optional,从而有效地解包Optional它与A.get().spring-doc.cadn.net.cn

下面的清单显示了一个更复杂的示例:spring-doc.cadn.net.cn

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表达:spring-doc.cadn.net.cn

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

这将注入名为pop3.port如果已定义,则为25如果未定义属性。spring-doc.cadn.net.cn