Java 提供了多種方法和類可以用來拼接字符串。但是如果我們不注意 null 對象,則生成的 String 可能包含一些不需要的值。
問題場景
假設(shè)我們要拼接的 String 數(shù)組的元素,其中任何元素都可能為 null。
舉個例子
String[] values = { "Java ", null, "", "is ", "great!" };
String result = "";
for (String value : values) {
result = result + value;
}
我們簡單地使用 + 運算符執(zhí)行拼接,得出來的結(jié)果是
Java nullis great!
但是,我們正常情況肯定是不喜歡在結(jié)果中包含 "null" 值。
同樣,如果我們的應(yīng)用程序在 Java 8 或更高版本上運行,我們使用 String.join()
靜態(tài)方法獲得相同的輸出:
String result = String.join("", values);
我們也不能避免在使用 String.join()
方法時連接 null 元素。
讓我們看看一些方法來避免這些空元素被串聯(lián)起來,并獲得我們期望的結(jié)果:"Java is great"
使用 + 運算符
加法 (+) 運算符被重載以連接 Java 中的字符串。在使用 + 運算符進行連接時,我們可以檢查 String 是否為 null,并將 null 字符串替換為空 ("")字符串:
for (String value : values) {
result = result + (value == null ? "" : value);
}
assertEquals("Java is great!", result);
或者,我們可以將檢查空字符串的代碼提取到一個 getNonNullString()
方法中,該方法接受一個String對象并返回一個非空字符串對象:
public String getNonNullString(value) {
return value == null ? "" : value;
}
for (String value : values) {
result = result + getNonNullString(value);
}
但是 String 對象在Java中是不可變的。這意味著每次我們使用 + 運算符連接 String 對象時,都會在內(nèi)存中創(chuàng)建一個新的 String。因此使用 + 運算符進行拼接是比較浪費資源的。
使用String.concat() 方法
當我們想要拼接 String 對象時,String.concat()
方法是一個不錯的選擇。
在這里,我們可以使用我們的 getNonNullString()
方法,該方法檢查空對象并返回空字符串:
for (String value : values) {
result = result.concat(getNonNullString(value));
}
getNonNullString()方法返回的空字符串與結(jié)果串聯(lián),從而忽略null對象。
使用StringBuilder類
StringBuilder 提供了一堆有用且方便的字符串構(gòu)建方法。其中之一是 append() 方法。
在這里,我們可以使用相同的 getNonNullString()
方法來避免在使用 append() 方法時出現(xiàn)空對象:
for (String value : values) {
result = result.append(getNonNullString(value));
}
使用StringJoiner類 (Java 8+)
StringJoiner 類提供了 String.join()
的所有功能,以及一個以給定前綴開頭并以給定后綴結(jié)尾的選項。我們可以使用它的 add()
方法來連接字符串s。
和以前一樣,我們可以使用我們的幫助器方法 getNonNullString()
來避免空字符串值被串聯(lián)起來:
StringJoiner result = new StringJoiner("");
for (String value : values) {
result = result.add(getNonNullString(value));
}
String.join()
和 StringJoiner 之間的一個區(qū)別是,與 String.join()
不同,我們必須遍歷集合(Array、List等)來聯(lián)接所有元素。
使用Streams.filter (Java 8+)
Stream API 提供大量順序和并行聚合操作。一個這樣的中間流操作是過濾器,它接受一個謂詞作為輸入,并根據(jù)給定的謂詞將流轉(zhuǎn)換為另一個流。
因此,我們可以定義一個謂詞,該謂詞將檢查字符串的空值,并將此謂詞傳遞給filter()方法。因此,篩選器將從原始流中篩選出這些空值。
最后,我們可以使用Collectors.joining()連接所有這些非空字符串值,最后將生成的Stream收集到String變量中:
result = Stream.of(values).filter(value - > null != value).collect(Collectors.joining(""));
總結(jié)
在本文中,我們演示了避免 null 字符串對象串聯(lián)的各種方法。總會有不止一種正確的方法來滿足我們的要求。因此,我們必須確定哪種方法最適合給定的地方。
我們必須記住,連接String本身可能是一個昂貴的操作,特別是在循環(huán)中。因此,始終建議考慮 Java 字符串 API 的性能。
-
JAVA
+關(guān)注
關(guān)注
19文章
2959瀏覽量
104553 -
字符串
+關(guān)注
關(guān)注
1文章
577瀏覽量
20486 -
null
+關(guān)注
關(guān)注
0文章
17瀏覽量
3919 -
string
+關(guān)注
關(guān)注
0文章
40瀏覽量
4719
發(fā)布評論請先 登錄
相關(guān)推薦
評論