可变参数调用
以下示例展示了如何通过在表达式中提供单独的参数('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 中调用变长参数构造函数、方法或函数时,可能会对各个参数应用类型转换。
例如,如果我们已经在 EvaluationContext
中注册了一个自定义函数,名为 #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…
参数列表的可变参数调用。
以下代码清单展示了我们可以向 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)