可変引数呼び出し

Spring 式言語は、コンストラクターメソッド、およびユーザー定義関数varargs [Oracle] 呼び出しをサポートします。

次の例は、可変引数リストを個別の引数 ('blue', 1) として指定して、式内で java.lang.String#formatted(Object…​) varargs メソッドを呼び出す方法を示しています。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted('blue', 1)";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted('blue', 1)"
val message = parser.parseExpression(expression).getValue(String::class.java)

可変引数リストは、次の例 (new Object[] {'blue', 1}) に示すように、配列として指定することもできます。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

代わりに、可変引数リストを java.util.List として、たとえばインラインリスト ({'blue', 1}) として提供することもできます。次の例は、その方法を示しています。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%d'.formatted({'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%d'.formatted({'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)

可変引数の型変換

Java での varargs 呼び出しの標準サポートとは対照的に、SpEL で varargs コンストラクター、メソッド、関数を呼び出すときに、個々の引数に型変換が適用される場合があります。

たとえば、シグネチャー String reverseStrings(String…​ strings) を持つメソッドのカスタム関数を EvaluationContext に #reverseStrings という名前で登録した場合、次の例に示すように、String に変換できる任意の引数を使用して SpEL 式内でその関数を呼び出すことができます。

  • Java

  • Kotlin

// evaluates to "3.0, 2.0, 1, SpEL"
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
String message = parser.parseExpression(expression)
		.getValue(evaluationContext, String.class);
// evaluates to "3.0, 2.0, 1, SpEL"
val expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)"
val message = parser.parseExpression(expression)
		.getValue(evaluationContext, String::class.java)

同様に、コンポーネント型が必須の varargs 型のサブ型である配列は、varargs 呼び出しの可変引数リストとして指定できます。例: String[] 配列は、Object…​ 引数リストを受け入れる varargs 呼び出しに指定できます。

次のリストは、java.lang.String#formatted(Object…​) varargs メソッドに String[] 配列を提供できることを示しています。また、1 が自動的に "1" に変換されることも強調しています。

  • Java

  • Kotlin

// evaluates to "blue is color #1"
String expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// evaluates to "blue is color #1"
val expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})"
val message = parser.parseExpression(expression).getValue(String::class.java)