Elvis 運算子

Elvis 運算子 (?:) 是三元運算子語法的縮寫,用於 Groovy 語言。使用三元運算子語法,您通常需要重複變數兩次,如下面的 Java 示例所示

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

相反,您可以使用 Elvis 運算子(因其與 Elvis 的髮型相似而得名)。以下示例展示瞭如何在 SpEL 表示式中使用 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 物件。因此,原始的 Java 示例僅接近於模擬該運算子的語義:它需要使用 name != null && !name.isEmpty() 作為謂詞,才能與 SpEL Elvis 運算子的語義相容。

從 Spring Framework 7.0 開始,SpEL Elvis 運算子支援 java.util.Optional,具有透明解包語義。

例如,給定表示式 A ?: B,如果 Anull Optional,則表示式評估為 B。但是,如果 A 是非空 Optional,則表示式評估為 Optional 中包含的物件,從而有效地解包 Optional,這與 A.get() 相關。

以下列表顯示了一個更復雜的示例

  • 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

© . This site is unofficial and not affiliated with VMware.