跳到主要内容
版本:7.0.3

变长参数调用

Hunyuan 7b 中英对照 Varargs Invocations

Spring表达式语言支持对构造函数方法以及用户自定义函数使用可变参数

以下示例展示了如何在表达式中调用java.lang.String#formatted(Object…)方法,并通过提供单独的参数列表('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);

可变参数列表也可以以数组的形式提供,如下例所示(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.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中对可变参数(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);

同样,任何其组件类型是所需可变参数(varargs)类型子类型的数组都可以作为可变参数调用的变量参数列表提供。例如,一个String[]数组可以提供给一个接受Object…参数列表的可变参数调用。

以下示例表明,我们可以将一个String[]数组传递给`java.lang.String#formatted(Object…)**方法(该方法是带可变参数的)。同时这也展示了“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);