跳到主要内容

可变参数调用

DeepSeek V3 中英对照 Varargs Invocations

Spring 表达式语言支持构造函数方法和用户定义的函数可变参数调用。

以下示例展示了如何通过在表达式中提供单独的参数('blue', 1)来调用 java.lang.String#formatted(Object…​) varargs 方法。

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

一个可变参数列表也可以作为数组提供,如下例所示 (new Object[] {'blue', 1})。

// 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);
java

作为一种替代方案,可以提供一个变量参数列表作为 java.util.List —— 例如,作为一个内联列表 ({'blue', 1})。以下示例展示了如何做到这一点。

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

可变参数类型转换

与 Java 中标准支持的变长参数(varargs)调用不同,在 SpEL 中调用变长参数构造函数、方法或函数时,可能会对各个参数应用类型转换

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

// 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);
java

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

以下代码清单展示了我们可以向 java.lang.String#formatted(Object…​) varargs 方法提供一个 String[] 数组。它还强调了 1 会自动转换为 "1"

// 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);
java