このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Framework 6.2.8 を使用してください!

エルビス演算子

エルビス演算子 (?:) は、三項演算子構文の短縮形であり、Groovy (英語) 言語で使用されます。三項演算子構文では、次の Java の例に示すように、変数を 2 回繰り返す必要があることがよくあります。

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 の例は、この演算子のセマンティクスをほぼエミュレートしているに過ぎません。SpEL Elvis 演算子のセマンティクスと互換性を持たせるには、述語として name != null && !name.isEmpty() を使用する必要があります。

Spring Framework 7.0 以降、SpEL Elvis 演算子は透過的なアン折り返し セマンティクスを備えた java.util.Optional をサポートします。

例: 式 A ?: B が与えられた場合、A が null または空の Optional であれば、式は B と評価されます。しかし、A が空でない Optional であれば、式は Optional に含まれるオブジェクトと評価され、結果として A.get() に対応する Optional が展開されます。

次のリストは、より複雑な例を示しています。

  • 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 が挿入されます。