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