Java 中的字符串插值
一、概述
在本教程中,我們將討論 Java 中的String
插值主題。我們將查看幾個不同的示例,然後查看一些細節。
2. Java中的String
插值
String
插值是一種將變量值注入字符串的直接而精確的方法.
**它允許用戶將變量引用直接嵌入到處理過的字符串文字中。與 Scala 等語言相比, **Java 缺乏對String
插值的原生支持。
但是,有一些方法可以在 Java 中完成此行為。在以下部分中,我們將解釋其中的每一種方法。
3.加運算符
首先,我們有“+”運算符。我們可以使用“+”運算符連接我們的變量和字符串值。變量被它的值替換,所以我們實現了字符串的插值或連接。讓我們看一個代碼示例:
@Test
public void givenTwoString_thenInterpolateWithPlusSign() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String first = "Interpolation";
String second = "Java";
String result = "String " + first + " in " + second + " with some " + second + " examples.";
assertEquals(EXPECTED_STRING, result);
}
正如我們在前面的示例中註意到的那樣,使用此運算符,生成的String
包含變量的值“插值”與其他字符串值。由於可以根據特定需要對其進行調整,因此這種字符串連接方法是最直接和最有價值的方法之一。使用運算符時,我們不需要將文本放在引號中。
4. format()
函數
另一種方法是使用String
類中的format()
方法。與“+”運算符相反,在這種情況下,我們需要使用佔位符來獲得String
插值中的預期結果。以下 代碼片段演示了它是如何運作的:
@Test
public void givenTwoString_thenInterpolateWithFormat() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String first = "Interpolation";
String second = "Java";
String result = String.format("String %s in %s with some %s examples.", first, second, second);
assertEquals(EXPECTED_STRING, result);
}
此外,如果我們想避免在我們的format
調用中重複變量,我們可以引用一個特定的參數。讓我們看看這個行為:
@Test
public void givenTwoString_thenInterpolateWithFormatStringReference() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String first = "Interpolation";
String second = "Java";
String result = String.format("String %1$s in %2$s with some %2$s examples.", first, second);
assertEquals(EXPECTED_STRING, result);
}
現在,我們減少了不必要的變量重複。相反,我們使用參數列表中參數的索引。
StringBuilder
類
我們下面的方法是StringBuilder
類。我們實例化一個StringBuilder
對象,然後調用append()
函數來構建String
。在此過程中,我們的變量被添加到結果String
中:
@Test
public void givenTwoString_thenInterpolateWithStringBuilder() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String first = "Interpolation";
String second = "Java";
StringBuilder builder = new StringBuilder();
builder.append("String ")
.append(first)
.append(" in ")
.append(second)
.append(" with some ")
.append(second)
.append(" examples.");
String result = builder.toString();
assertEquals(EXPECTED_STRING, result);
}
正如我們在上面的代碼示例中註意到的那樣,我們可以通過鏈接 append 函數來使用必要的文本插入字符串,該函數接受參數作為變量(在本例中為兩個Strings
)。
6. MessageFormat
類
使用MessageFormat
類是在 Java 中獲取String
插值的一種鮮為人知的方法。使用MessageFormat
,我們可以創建串聯消息而不用擔心底層語言。這是創建面向用戶的消息的標準方法。它獲取一個對象集合,格式化其中包含的字符串,並將它們插入到模式中的適當位置。
MessageFormat
的format
方法與String
的format
方法幾乎相同,除了佔位符的編寫方式。 {0}、{1}、{2} 等索引表示此函數中的佔位符:
@Test
public void givenTwoString_thenInterpolateWithMessageFormat() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String first = "Interpolation";
String second = "Java";
String result = MessageFormat.format("String {0} in {1} with some {1} examples.", first, second);
assertEquals(EXPECTED_STRING, result);
}
關於性能, StringBuilder
僅將文本附加到動態緩衝區;但是, MessageFormat
在附加數據之前解析給定的格式。正因為如此, StringBuilder
在效率上優於MessageFormat MessageFormat
7.阿帕奇公地
最後,我們有來自 Apache Commons 的StringSubstitutor
。在此類的上下文中,值被替換為包含在 String 中的變量。這個類接受一段文本並替換所有變量。變量的默認定義是${variableName}
。構造函數和設置方法可用於更改前綴和後綴。變量值的解析通常涉及使用映射。但是,我們可以通過使用系統屬性或提供專門的變量解析器來解析它們:
@Test
public void givenTwoString_thenInterpolateWithStringSubstitutor() {
String EXPECTED_STRING = "String Interpolation in Java with some Java examples.";
String baseString = "String ${first} in ${second} with some ${second} examples.";
String first = "Interpolation";
String second = "Java";
Map<String, String> parameters = new HashMap<>();
parameters.put("first", first);
parameters.put("second", second);
StringSubstitutor substitutor = new StringSubstitutor(parameters);
String result = substitutor.replace(baseString);
assertEquals(EXPECTED_STRING, result);
}
從我們的代碼示例中,我們可以看到我們創建了一個Map
。鍵名與將在String
中替換的變量名相同。然後,我們將每個鍵對應的值放入Map
中。接下來,我們將它作為構造函數參數傳遞給StringSubstitutor
類。最後,實例化對象調用replace()
函數。此函數接收帶有佔位符的文本作為參數。結果,我們得到了一個內插文本。就是這樣,很簡單。
八、結論
最後,我們對什麼是String
插值做了一個簡單的描述。接下來,我們使用本地 Java 運算符(來自String
類的format()
方法)以某種方式在 Java 語言中實現這一點。此外,我們還探索了Apache Commons
中鮮為人知的選項,例如MessageFormat
和StringSubstitutor
。
與往常一樣,代碼可在 GitHub 上獲得。