簡體   English   中英

Java 中的三重引號類似於 Scala

[英]Triple quotes in Java like Scala

在 Scala 你可以這樣做:

val expr = """ This is a "string" with "quotes" in it! """

Java里面有這樣的嗎? 我討厭使用"\""來表示帶引號的字符串。尤其是在 JSON 中組成鍵/值對時。惡心!

除了使用\\"在字符串文字中包含雙引號之外,沒有其他好的選擇。

有一些不好的選擇:

  • 使用" ,雙引號字符的 Unicode 轉義符。 編譯器將 Unicode 轉義視為鍵入該字符。 它被視為源代碼中的雙引號字符,結束/開始String文字,因此這不起作用。
  • 連接字符'"' ,例如"This is a " + '"' + "string" 這會起作用,但它似乎比僅使用\\"更丑陋且可讀性更差。
  • 連接char 34 以表示雙引號字符,例如"This is a " + (char) 34 + "string" 這會起作用,但更不明顯的是您試圖在字符串中放置雙引號字符。
  • 復制並粘貼 Word 的“智能引號”,例如"This is a “string” with “quotes” in it!" . 這些不是相同的字符(Unicode U+201C 和 U+201D); 它們有不同的外觀,但它們會起作用。

我想隱藏“惡心”,你可以把它隱藏在一個常數后面。

public static final String DOUBLE_QUOTE = "\"";

然后你可以使用:

String expr = " This is a " + DOUBLE_QUOTE + "string" + DOUBLE_QUOTE + ...;

它比其他選項更具可讀性,但它仍然不是很可讀,並且仍然很難看。

Java 中沒有"""機制,所以使用轉義\\"是最好的選擇。 它是最易讀的,也是最不難看的。

自 Java 13預覽功能

參考資料: https : //openjdk.java.net/jeps/355

它不能以 Scala 的方式精確地工作。 開頭的三重引號必須后跟一個新行。

var expr = """
           This is a 1-line "string" with "quotes" and no leading spaces in it! """;

關閉三重引號的位置很重要。 它定義了縮進大小。 例如,要縮進 2 個空格,請按如下方式定位結束符"""

String sql = """
               SELECT   emp_id, last_name
               FROM     postgres.employee
               WHERE    city = 'INDIANAPOLIS'
               ORDER BY emp_id, last_name;
             """;

這將導致 4 行文本:

  SELECT   emp_id, last_name
  FROM     postgres.employee
  WHERE    city = 'INDIANAPOLIS'
  ORDER BY emp_id, last_name;

逃脫:

三重引號轉義很直觀:

String txt = """
    A text block with three quotes \""" inside.""";

注意:此功能是預覽,因此您不能在 Java 13 中使用它,除非您設置--enable-preview TextBlock鍵。

更新:該功能使用 Java 14進入第二個預覽版 (JEP 368)

將等待 Java 15。

在做同樣的事情時發現了這個問題:組合小的文字 JSON 字符串以進行快速測試。 沒有出現的一種替代方法是使用雙單引號並用雙引號替換它們,例如:

String json = "{ ''label'' : ''set range'', ''min'' : 0, ''max'' : 100}".replace("''", "\"")

顯然,如果有常規的雙單引號,這將不起作用,但這種可能性應該很小。 這不是一個很好的解決方案,但看起來比很多反斜杠更好,imo。 作為將 json 放在單獨文件中的中間步驟,這可能還不錯。

"Raw String Literals"的特性本應在Java 12 中出現,但由於一些批評而被撤回,因為他們計划使用可變數量的反引號 (`)。

所以它最終出現在Java 13 中,作為"Text Block"功能,但僅在預覽中 它使用"""運算符,就像在 Scala 中一樣。

您可以在此處閱讀有關 Java 13 功能的更多信息

三重報價功能自Java 14起可用。 有關更多詳細信息,請參見例如https://howtodoinjava.com/java14/java-text-blocks/

您想要的功能稱為Text Blocks ,並在 Java 15, JEP378中提供。

歷史

文本塊由 JEP 355 於 2019 年初提出,作為 JEP 326(原始字符串文字)中開始的探索的后續,JEP 326 最初針對 JDK 12,但最終撤回並沒有出現在該版本中。 JEP 355 於 2019 年 6 月作為預覽功能針對 JDK 13。 JDK 13 的反饋建議在 JDK 14 中再次預覽文本塊,並添加兩個新的轉義序列。 因此,JEP 368 於 2019 年 11 月作為預覽功能針對 JDK 14。 關於 JDK 14 的反饋表明,文本塊已准備好在 JDK 15 中成為最終的和永久的,無需進一步更改。

用法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM