<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>

          Java8使用StringJoiner看這一篇就夠了

          共 4783字,需瀏覽 10分鐘

           ·

          2020-11-22 14:49

          ????點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          66套java從入門到精通實(shí)戰(zhàn)課程分享

          在開發(fā)過程中,有時(shí)候需要打印集合中的對(duì)象的某個(gè)屬性,為了格式化以前常用StrinigBuffer。

          比如下面這種代碼:

          Set?catSet?=?new?HashSet<>(2);
          ?
          ????@Before
          ????public?void?init()?{
          ????????Cat?cat?=?new?Cat();
          ????????cat.setName("老大");
          ????????cat.setAge(1);
          ????????catSet.add(cat);
          ????????Cat?cat2?=?new?Cat();
          ????????cat2.setName("老二");
          ????????cat2.setAge(2);
          ????????catSet.add(cat2);
          ?
          ????}
          ?
          ????@Test
          ????public?void?print1()?{
          ?
          ????????//?給出友好提示
          ????????StringBuilder?stringBuilder?=?new?StringBuilder();
          ????????stringBuilder.append("[");
          ????????Iterator?iterator?=?catSet.iterator();
          ????????int?seq?=?0;
          ????????while?(iterator.hasNext())?{
          ????????????seq++;
          ????????????stringBuilder.append(seq);
          ????????????stringBuilder.append(":");
          ????????????stringBuilder.append(iterator.next().getName());
          ????????????if?(seq?!=?catSet.size())?{
          ????????????????stringBuilder.append(",");
          ????????????}
          ????????}
          ????????stringBuilder.append("]");
          ????????Assert.assertEquals("[1:老二,2:老大]",?stringBuilder.toString());
          ?
          ????}

          最近接觸到Java8提供了StringJoiner,看到一篇不錯(cuò)的文章,翻譯在此,文后給出改進(jìn)方案,一行代碼解決問題!

          --------------------------------------------分割線-------------------------------------------------------------

          添加元素

          @Test
          public?void?whenAddingElements_thenJoinedElements()?{
          ????StringJoiner?joiner?=?new?StringJoiner(",",?PREFIX,?SUFFIX);
          ????joiner.add("Red")
          ??????.add("Green")
          ??????.add("Blue");
          ?
          ????assertEquals(joiner.toString(),?"[Red,Green,Blue]");
          }

          如果想講List添加到其中:

          @Test
          public?void?whenAddingListElements_thenJoinedListElements()?{
          ????List?rgbList?=?new?ArrayList<>();
          ????rgbList.add("Red");
          ????rgbList.add("Green");
          ????rgbList.add("Blue");
          ?
          ????StringJoiner?rgbJoiner?=?new?StringJoiner(
          ??????",",?PREFIX,?SUFFIX);
          ?
          ????for?(String?color?:?rgbList)?{
          ????????rgbJoiner.add(color);
          ????}
          ?
          ????assertEquals(rgbJoiner.toString(),?"[Red,Green,Blue]");
          }

          構(gòu)造

          private?String?PREFIX?=?"[";
          private?String?SUFFIX?=?"]";
          ?
          @Test
          public?void?whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString()?{
          ????StringJoiner?joiner?=?new?StringJoiner(",");
          ??
          ????assertEquals(0,?joiner.toString().length());
          }
          ?
          @Test
          public?void?whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix()?{
          ????StringJoiner?joiner?=?new?StringJoiner(
          ??????",",?PREFIX,?SUFFIX);
          ??
          ????assertEquals(joiner.toString(),?PREFIX?+?SUFFIX);
          }

          ?toString()?方法得到當(dāng)前連接對(duì)象的字符串形式。

          沒有指定前綴和后綴的Joiner對(duì)象將返回空字符串。

          @Test
          public?void?whenEmptyJoinerWithEmptyValue_thenDefaultValue()?{
          ????StringJoiner?joiner?=?new?StringJoiner(",");
          ????joiner.setEmptyValue("default");
          ?
          ????assertEquals(joiner.toString(),?"default");
          }
          ?
          @Test
          public?void?whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue()?{
          ????StringJoiner?joiner?=?new?StringJoiner(",",?PREFIX,?SUFFIX);
          ????joiner.setEmptyValue("default");
          ?
          ????assertEquals(joiner.toString(),?"default");
          }

          可以調(diào)用joiner.setEmptyValue()函數(shù),設(shè)置默認(rèn)值。

          Joiners組合使用

          private?String?PREFIX?=?"[";
          private?String?SUFFIX?=?"]";
          ?
          @Test
          public?void?whenMergingJoiners_thenReturnMerged()?{
          ????StringJoiner?rgbJoiner?=?new?StringJoiner(
          ??????",",?PREFIX,?SUFFIX);
          ????StringJoiner?cmybJoiner?=?new?StringJoiner(
          ??????"-",?PREFIX,?SUFFIX);
          ?
          ????rgbJoiner.add("Red")
          ??????.add("Green")
          ??????.add("Blue");
          ????cmybJoiner.add("Cyan")
          ??????.add("Magenta")
          ??????.add("Yellow")
          ??????.add("Black");
          ?
          ????rgbJoiner.merge(cmybJoiner);
          ?
          ????assertEquals(
          ??????rgbJoiner.toString(),?
          ??????"[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
          }

          兩個(gè)joiner可以通過merge函數(shù),組合在一起。

          利用Stream API

          @Test
          public?void?whenUsedWithinCollectors_thenJoined()?{
          ????List?rgbList?=?Arrays.asList("Red",?"Green",?"Blue");
          ????String?commaSeparatedRGB?=?rgbList.stream()
          ??????.map(color?->?color.toString())
          ??????.collect(Collectors.joining(","));
          ?
          ????assertEquals(commaSeparatedRGB,?"Red,Green,Blue");
          }


          英文原文:https://www.baeldung.com/java-string-joiner

          --------------------------------------------分割線-------------------------------------------------------------

          改進(jìn)

          根據(jù)本文的學(xué)習(xí)對(duì)我們的代碼進(jìn)行改進(jìn):

          第一版:

          ?@Test
          ????public?void?print()?{
          ????????StringJoiner?stringJoiner?=?new?StringJoiner(",",?"[",?"]");
          ????????Iterator?iterator?=?catSet.iterator();
          ????????int?seq?=?0;
          ????????while?(iterator.hasNext())?{
          ????????????seq++;
          ????????????stringJoiner.add(seq?+?":"?+?iterator.next().getName());
          ????????}
          ????????Assert.assertEquals("[1:老二,2:老大]",?stringJoiner.toString());
          ????}

          第二版:

          ???@Test
          ????public?void?print2()?{
          List?catList?=?new?ArrayList<>(catSet);
          ????????String?result?=?IntStream.range(0,catList.size()).mapToObj(i->i+":"+?catList.get(i).getName()).collect(Collectors.joining(",",?"[",?"]"));
          ????????Assert.assertEquals("[1:老二,2:老大]",?result);
          ????}

          一行代碼,很簡(jiǎn)單,很優(yōu)雅!!!




          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/w605283073/article/details/89527280






          粉絲福利:實(shí)戰(zhàn)springboot+CAS單點(diǎn)登錄系統(tǒng)視頻教程免費(fèi)領(lǐng)取

          ???

          ?長按上方微信二維碼?2 秒
          即可獲取資料



          感謝點(diǎn)贊支持下哈?

          瀏覽 59
          點(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>
                  亚洲色图第一页 | 狂操美女影院 | 青娱乐日韩无码 | 日日日日日日日日日日日日日日日干 | 国产色情性黄 片Av网站 |