可变参数调用

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

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

  • 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 中对可变参数调用的标准支持不同,在 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…​ 参数列表的可变参数调用。

以下列表展示了我们可以将一个 String[] 数组提供给 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)
© . This site is unofficial and not affiliated with VMware.