可变参数调用

Spring 表达式语言支持对 构造函数方法 以及用户定义的 函数 进行 可变参数 调用。 以下示例展示了如何在表达式中调用 java.lang.String#formatted(Object…​) 可变参数 方法,通过提供单独的参数(’blue'`,1)作为可变参数列表。

  • Java

  • Kotlin

// 结果为 "blue is color #1"
String expression = "'%s is color #%d'.formatted('blue', 1)";
String message = parser.parseExpression(expression).getValue(String.class);
// 结果为 "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

// 结果为 "blue is color #1"
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
String message = parser.parseExpression(expression).getValue(String.class);
// 结果为 "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

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

可变参数类型转换

与 Java 中对可变参数调用的标准支持不同,在 SpEL 中调用可变参数构造函数、方法或函数时, 类型转换 可以应用于单个参数。

例如,如果在 EvaluationContext 中注册了一个名为 #reverseStrings 的自定义 函数,其方法签名为 String reverseStrings(String…​ strings),我们可以在 SpEL 表达式中调用该函数,并提供任何可以转换为 String 的参数,如以下示例所示。

  • Java

  • Kotlin

// 结果为 "3.0, 2.0, 1, SpEL"
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
String message = parser.parseExpression(expression)
		.getValue(evaluationContext, String.class);
// 结果为 "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)

类似地,任何组件类型是所需可变参数类型子类型的数组都可以作为可变参数列表提供给可变参数调用。例如,String[] 数组可以提供给接受 Object…​ 参数列表的可变参数调用。

以下列表演示了我们可以将 String[] 数组提供给 java.lang.String#formatted(Object…​) 可变参数 方法。它还强调了 1 将自动转换为 "1"

  • Java

  • Kotlin

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