<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          字符串拼接這種小事,我翻車(chē)了...

          共 2695字,需瀏覽 6分鐘

           ·

          2022-01-01 02:03

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

          最近指北君在一個(gè)字符串拼接的小事情上翻車(chē)了,真的是萬(wàn)萬(wàn)沒(méi)想到。Java 提供了多種方法和類(lèi)可以用來(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類(lèi)

          StringBuilder 提供了一堆有用且方便的字符串構(gòu)建方法。其中之一是 append() 方法。

          在這里,我們可以使用相同的 getNonNullString() 方法來(lái)避免在使用 append() 方法時(shí)出現(xiàn)空對(duì)象:

          for?(String?value?:?values)?{
          ????result?=?result.append(getNonNullString(value));
          }

          使用StringJoiner類(lèi) (Java 8+)

          StringJoiner 類(lèi)提供了 String.join() 的所有功能,以及一個(gè)以給定前綴開(kāi)頭并以給定后綴結(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)滿(mǎn)足我們的要求。因此,我們必須確定哪種方法最適合給定的地方。

          我們必須記住,連接String本身可能是一個(gè)昂貴的操作,特別是在循環(huán)中。因此,始終建議考慮 Java 字符串 API 的性能。


          1、Log4j2維護(hù)者吐槽沒(méi)工資還要挨罵,GO安全負(fù)責(zé)人建議開(kāi)源作者向公司收費(fèi)

          2、太難了!讓程序員崩潰的8個(gè)瞬間

          3、2021年程序員們都在用的神級(jí)數(shù)據(jù)庫(kù)

          4、Windows重要功能被閹割,全球用戶(hù)怒噴數(shù)月后微軟終于悔改

          5、牛逼!國(guó)產(chǎn)開(kāi)源的遠(yuǎn)程桌面火了,只有9MB 支持自建中繼器!

          6、摔到老三的 Java,未來(lái)在哪?

          7、真香!用 IDEA 神器看源碼,效率真高!

          點(diǎn)分享

          點(diǎn)收藏

          點(diǎn)點(diǎn)贊

          點(diǎn)在看

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本学生妹内射视频在线观看 | 人成无码 | 久久视频网址 | 天天日天天插天天操 | 中文字幕三级片 |