|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Framework 7.0.6! |
可变参数调用
Spring 表达式语言支持对可变参数(varargs)的调用,适用于构造函数、方法以及用户自定义的函数。
以下示例展示了如何在表达式中调用 java.lang.String#formatted(Object…) 的可变参数方法,通过将可变参数列表作为独立的参数('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)
变量参数列表也可以以数组形式提供,如下例所示(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 中调用可变参数构造函数、方法或函数时, 可能会对各个参数应用类型转换。
例如,如果我们在 xref page 中注册了一个自定义
函数,其名称为 #reverseStrings,对应的方法签名为
String reverseStrings(String… strings),那么我们就可以在 SpEL 表达式中调用该函数,并传入任何可转换为 String 类型的参数,如下例所示。
-
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)
同样,任何组件类型为所需可变参数类型子类型的数组,都可以作为可变参数调用的可变参数列表传入。例如,一个 String[] 数组可以传递给接受 Object… 参数列表的可变参数调用。
以下示例说明,我们可以向 String[] 的可变参数(varargs)方法传入一个 java.lang.String#formatted(Object…) 数组。同时,该示例还强调了数值 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)