可變引數呼叫
以下示例展示瞭如何在表示式中透過提供單獨的引數列表('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)