0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

null字符串對(duì)象串聯(lián)的各種方法

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 16:27 ? 次閱讀

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 的性能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Python字符串的特點(diǎn)和修改字符串的常見四種方法

    Python中修改字符串的幾種方法
    發(fā)表于 02-26 16:52

    請(qǐng)問(wèn)JavaScript字符串對(duì)象String是什么?

    字符串對(duì)象 String 提供了對(duì)字符串進(jìn)行處理的屬性和方法
    發(fā)表于 11-05 06:39

    python字符串拼接方式了解

    ()方法拼接 用string模塊中的Template對(duì)象 例子: fruit1 = ‘a(chǎn)pples’ fruit2 = ‘bananas’ fruit3 = ‘pears’ 要求: 輸出字符串
    發(fā)表于 12-06 10:09 ?1034次閱讀

    實(shí)踐得出Labview字符串分離的四種方法

    1.??? 第一種方法名稱:掐頭去尾去脖子使用范圍:適用于任何情況流程:步驟一:“拉力1:100g. 拉力2:2000g. 拉力3:30g” “搜索/拆分字符串”(“搜索匹配字符串/字符
    發(fā)表于 07-04 16:54 ?1.2w次閱讀
    實(shí)踐得出Labview<b class='flag-5'>字符串</b>分離的四<b class='flag-5'>種方法</b>

    什么是復(fù)制字符串?Python如何復(fù)制字符串

    。 在上一篇文章《你真的知道Python的字符串怎么用嗎?》里,我突發(fā)奇想,將字符串跟列表做了比較,然后發(fā)現(xiàn)字符串竟然沒(méi)有復(fù)制的方法。當(dāng)時(shí)沒(méi)有細(xì)想,只說(shuō)要擱置疑問(wèn)。過(guò)后,有好學(xué)的小伙伴
    發(fā)表于 11-25 10:32 ?3019次閱讀

    字符串string對(duì)象操作的全面總結(jié)

    ? ? 字符串操作看似簡(jiǎn)單,其實(shí)非常重要,不注意的話,經(jīng)常出現(xiàn)代碼運(yùn)行結(jié)果和自己想要的不一致,甚至崩潰。本文總結(jié)了一些構(gòu)建string對(duì)象方法、修改string對(duì)象
    的頭像 發(fā)表于 11-11 11:23 ?1951次閱讀
    <b class='flag-5'>字符串</b>string<b class='flag-5'>對(duì)象</b>操作的全面總結(jié)

    python對(duì)齊字符串的兩種方法

    當(dāng)你不指定 < 、>、^ 時(shí),對(duì)字符串,默認(rèn)左對(duì)齊;對(duì)數(shù)值,默認(rèn)右對(duì)齊
    的頭像 發(fā)表于 04-12 15:27 ?3349次閱讀

    平化字符串處理方法簡(jiǎn)介

    這里介紹一組有用的字符串處理方法,即平化至字符串和從字符串還原。
    的頭像 發(fā)表于 09-26 10:20 ?2270次閱讀

    python字符串有哪些特定方法

    python字符串序列操作也適用于列表和元組。 python字符串還有獨(dú)有方法,即字符串對(duì)象的函數(shù),其他
    的頭像 發(fā)表于 02-23 15:02 ?712次閱讀

    C語(yǔ)言定義字符串的幾種方法

    C語(yǔ)言中定義字符串有哪些方法
    的頭像 發(fā)表于 03-31 09:41 ?3570次閱讀

    Python中檢查字符串包含的方法

    Python 有多種處理字符串方法。今天我們介紹如何檢查一個(gè)字符串中是否包含另一個(gè)字符串
    的頭像 發(fā)表于 05-14 16:02 ?1.6w次閱讀

    代碼字符串分割方法

    的 String#split 來(lái)分割。 使用 String#split 方法 String 類中 split 方法,是我們平常處理字符串分割最常用的方法之一,它可以根據(jù)給定的分隔符或正
    的頭像 發(fā)表于 09-25 11:42 ?808次閱讀

    如何去掉oracle字符型數(shù)據(jù)里的null

    等同于空字符串,空字符串是一個(gè)有效的值,而NULL值表示未知或不適用的值。在處理數(shù)據(jù)時(shí),我們有時(shí)需要將NULL值替換為其他的值或者將其忽略。 下面是去掉Oracle
    的頭像 發(fā)表于 12-06 09:46 ?1332次閱讀

    C語(yǔ)言字符串編譯函數(shù)介紹

    在C語(yǔ)言中,字符串實(shí)際上是使用null字符O'終止的一維字符數(shù)組。因此,一個(gè)以null結(jié)尾的
    的頭像 發(fā)表于 03-07 16:18 ?514次閱讀
    C語(yǔ)言<b class='flag-5'>字符串</b>編譯函數(shù)介紹

    labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進(jìn)制字符串是一個(gè)常見的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時(shí)。LabVIEW提供了多種方法來(lái)實(shí)現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?2480次閱讀