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

          Java 中的 3 個(gè)雙引號(hào)是什么語法?Java 15 刷新你的認(rèn)知!

          共 3046字,需瀏覽 7分鐘

           ·

          2020-10-28 09:51

          Java技術(shù)棧

          www.javastack.cn

          關(guān)注閱讀更多優(yōu)質(zhì)文章



          Java 中的 3 個(gè)雙引號(hào) """ 是什么語法?

          這是 Java 15 ?新出的,刷新你的認(rèn)知!

          一、前言

          Java 15 的推出的時(shí)候,Text Blocks 正式轉(zhuǎn)正,我叫它 “文本塊” 好了,棧長也做了簡單介紹,沒看過的可以點(diǎn)擊這里看下。

          文本塊,是一個(gè)多行字符串,它可以避免使用大多數(shù)轉(zhuǎn)義符號(hào),自動(dòng)以可預(yù)測的方式格式化字符串,并讓開發(fā)人員在需要時(shí)可以控制格式。

          文本塊最早準(zhǔn)備在 JDK 12 添加的,但最終撤消了,然后在 JDK 13 中作為預(yù)覽特性進(jìn)行了添加,然后又在 JDK 14 中再次預(yù)覽,在 JDK 15 中,文本塊終于轉(zhuǎn)正,暫不再做進(jìn)一步的更改。

          二、示例

          來看下這個(gè) HTML 語言示例你就懂了:

          不使用 Text Blocks::

          String?html1?=?"\n"?+
          ??????????????"????\n"?+
          ??????????????"????????

          Hi,?Java技術(shù)棧

          \n"
          ?+
          ??????????????"????????

          歡迎關(guān)注,分享更多干貨

          \n"
          ?+
          ??????????????"????\n"?+
          ??????????????"\n";

          使用 Text Blocks:

          String?html2?=?"""
          ??????????????
          ??????????????????
          ??????????????????????

          Hi,?Java技術(shù)棧


          ??????????????????????

          歡迎關(guān)注,分享更多干貨


          ??????????????????
          ??????????????
          ??????????????"
          "";

          文本塊需要用三個(gè)雙引號(hào)包起來,熟悉 Python 的都知道,三個(gè)雙引號(hào)表示多行注釋,沒想到 Java 竟然用作了多行字符串……

          再來看下字節(jié)碼:

          看到了吧?文本塊編譯后會(huì)自動(dòng)添加換行符,和原始的拼接寫法編譯結(jié)果一致,再也不用再拼接字符串了。

          三、詳細(xì)介紹

          其實(shí)文本塊的作用遠(yuǎn)不止換行符這么簡單,下面棧長詳細(xì)介紹下。

          1、Line terminators(換行符)

          如上面介紹,編譯期自動(dòng)增加換行符可以用來增強(qiáng)用非 Java 語言編寫的代碼的字符串的可讀性,比如我們經(jīng)常要拼接 HTML、XML、SQL 語言代碼等,代碼非常難看。

          """
          Java
          line?2
          line?3
          "
          ""

          就等同于:

          "line?1\nline?2\nline?3\n"

          或者:

          "line?1\n"?+
          "line?2\n"?+
          "line?3\n"

          如果最后一行不需要換行,可以這么寫:

          """
          line?1
          line?2
          line?3"
          ""

          還可以定義一個(gè)空的文本塊:

          String?empty?=?"""
          "
          "";

          一個(gè)空字符串也需要兩行代碼,所以這個(gè)方式是不推薦使用的。

          2、Incidental white space(空格編排)

          繼續(xù)看上面那段代碼:

          注意這根線沒有,線前面有一排空格,意味著是不會(huì)被編譯進(jìn)去的,只是用來縮進(jìn)格式化方便閱讀,所以我叫它空格編排。

          如果 """ 在最后單獨(dú)占一排,則以它左對(duì)齊,否則以最靠左的一列左對(duì)齊。

          IDEA 真是強(qiáng)大啊,對(duì) JDK 15 都支持這么好了。如果你說沒激活碼,這都不是事,可以關(guān)注公眾號(hào)Java技術(shù)棧,回復(fù):idea,棧長教你免費(fèi)獲取正版。

          另外,Java 15 中新增了 String.stripIndent 實(shí)例方法,可以直接刪除每一行的開頭和結(jié)尾空白字符。

          3、Escape sequences(轉(zhuǎn)義字符)

          如下面代碼所示:

          我在代碼中又增加了 \s\n、\t 之類的轉(zhuǎn)義字符,可以直接拿來用,雙引號(hào)也不需要轉(zhuǎn)義。

          結(jié)果輸出:


          ????
          ????????

          Hi,??"Java技術(shù)棧"




          ????????

          歡迎關(guān)注,\分享"更多"干貨


          ????
          ???

          實(shí)際工作中可能出現(xiàn)的 SQL 語句的拼寫就有救了!

          不使用 Text Blocks:

          String?query?=?"SELECT?\"EMP_ID\",?\"LAST_NAME\"?FROM?\"EMPLOYEE_TB\"\n"?+
          ???????????????"WHERE?\"CITY\"?=?'INDIANAPOLIS'\n"?+
          ???????????????"ORDER?BY?\"EMP_ID\",?\"LAST_NAME\";\n";

          使用 Text Blocks:

          String?query?=?"""
          ???????????????SELECT?"
          EMP_ID",?"LAST_NAME"?FROM?"EMPLOYEE_TB"
          ???????????????WHERE?"
          CITY"?=?'INDIANAPOLIS'
          ???????????????ORDER?BY?"
          EMP_ID",?"LAST_NAME";
          ???????????????"
          "";

          當(dāng)然,拼接 SQL 要注意別造成 SQL 注入漏洞了,這里只是介紹使用。

          另外,Java 15 新增了一個(gè) String.translateEscapes 轉(zhuǎn)義方法,可以直接對(duì)字符串內(nèi)容進(jìn)行轉(zhuǎn)義。

          4、格式化參數(shù)

          Java 15 之前格式化字符串中的參數(shù)需要使用 String.format 靜態(tài)方法,感覺不是很方便,而在 Java 15 中新增了直接格式化字符串的方法:

          對(duì)上面的 SQL 語句進(jìn)行擴(kuò)展下,參數(shù)使用占位符進(jìn)行格式化:

          String?query?=?"""
          ???????????????SELECT?"
          EMP_ID",?"LAST_NAME"?FROM?"EMPLOYEE_TB"
          ???????????????WHERE?"
          CITY"?=?'%s'?AND?author?=?'%s'
          ???????????????ORDER?BY?"
          EMP_ID",?"LAST_NAME";
          ???????????????"
          "";
          ????????System.out.println(query.formatted("深圳",?"棧長"));

          結(jié)果輸出:

          SELECT?"EMP_ID",?"LAST_NAME"?FROM?"EMPLOYEE_TB"
          WHERE?"CITY"?=?'深圳'?AND?author?=?'棧長'
          ORDER?BY?"EMP_ID",?"LAST_NAME";

          直接使用字符串對(duì)象的 formatted 實(shí)例方法感覺更方便了!

          四、結(jié)語

          解讀 Text Blocks(文本塊)遠(yuǎn)比想象中要難很多,沒想到一個(gè)文本塊這么多細(xì)節(jié),文中只是對(duì)文本塊作了一個(gè)部分總結(jié),并不是文本塊的全部內(nèi)容,反正暫時(shí)也用不到,大家簡單了解即可。

          對(duì)文本塊感興趣的、想深入了解更多文本塊細(xì)節(jié)的同學(xué),可以參考官方說明:

          https://openjdk.java.net/jeps/378

          官方介紹文本塊用了 3 萬多字……可想而知解讀它的難度。

          本次棧長的分享就到這里了,希望對(duì)大家有用。覺得不錯(cuò),在看、轉(zhuǎn)發(fā)分享一下哦~

          最后,Java 系列教程還會(huì)繼續(xù)更新,關(guān)注Java技術(shù)棧公眾號(hào)第一時(shí)間推送,還可以在公眾號(hào)菜單中獲取歷史 Java 教程,都是干貨。





          關(guān)注Java技術(shù)??锤喔韶?/strong>



          戳原文,獲取精選面試題!
          瀏覽 63
          點(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>
                  日比视频网站 | 黄色电影入口 | 免费在线观看亚洲天堂 | 久热精品视频在线播放 | 囯产精品久久久久久久免牛肉蒲团 |