• Java13新特性 -- 文本块


    在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了。这个JEP与引入多行字符串文字(text block)
    在意义上是类似的。
    这条新特性跟 Kotlin 里的文本块是类似的。
    现实问题
    在Java中,通常需要使用String类型表达HTML,XML,SQL或JSON等格式的字符串,在进行字符串赋值时需要进行
    转义和连接操作,然后才能编译该代码,这种表达方式难以阅读并且难以维护。
    文本块就是指多行字符串,例如一段格式化后的xml、json等。而有了文本块以后,用户不需要转义,Java能自动搞
    定。因此,文本块将提高Java程序的可读性和可写性。

    目标
    • 简化跨越多行的字符串,避免对换行等特殊字符进行转义,简化编写Java程序。
    • 增强Java程序中字符串的可读性。
    举例

    会被自动转义,如有一段以下字符串:

    <html>
        <body>
        	<p>Hello, 尚硅谷</p>
        </body>
    </html>
    

    jdk13中的写法:

    """
        <html>
            <body>
            	<p>Hello, world</p>
            </body>
        </html>
    """;
    

    使用“”“作为文本块的开始符和结束符,在其中就可以放置多行的字符串,不需要进行任何转义。

    具体使用:

    1. 基本使用
      • 文本块是Java语言中的一种新文字。它可以用来表示任何字符串,并且提供更大的表现力和更少的复杂性。
      • 文本块中的内容可以直接使用",",但不是必需的。
      • 文本块中的内容可以直接包括行终止符。允许在文本块中使用 ,但不是必需的。
      • 文本块由零个或多个字符组成,由开始和结束分隔符括起来。
        • 开始分隔符是由三个双引号字符("""),后面可以跟零个或多个空格,最终以行终止符结束。文本块内容以开始分隔符的行终止符后的第一个字符开始
          结束分隔符也是由三个双引号字符(""")表示,文本块内容以结束分隔符的第一个双引号之前的最后一个字符结束。

      在运行时,文本块将被实例化为String的实例,就像字符串一样。从文本块派生的String实例与从字符串派生的实例
      是无法区分的。具有相同内容的两个文本块将引用相同的String实例,就像字符串一样。

    2. 编译器在编译时会删除掉这些多余的空格。
    String html = """
    ..............<html>
    .............. <body>
    .............. <p>Hello, world</p>
    .............. </body>
    ..............</html>
    ..............""";
    

    如下文本块,这些多余的空格对于程序员来说是看不到的,但是他又是实际存在的,所以如果编译器不做处理,可能会导致程序员看到的两个文本块内容是一样的,但是这两个文本块却因为存在这种多余的空格而导致差异,比如哈希值不相等。

    String html = """
    ..............<html>...
    .............. <body>
    .............. <p>Hello, world</p>....
    .............. </body>.
    ..............</html>...
    ..............""";
    
    1. 转义字符

    允许开发人员使用 ,f 和 来进行字符串的垂直格式化,使用 和 进行水平格式化。比如下面的代码是合法
    的:

    String html = """
                <html>
    
                    <body>
    
                    	<p>Hello, world</p>
    
                    </body>
    
                </html>
    
                """;
    

    在文本块内自由使用"是合法的:

    String story = """
        "When I use a word," Humpty Dumpty said,
        in rather a scornful tone, "it means just what I
        choose it to mean - neither more nor less."
        "The question is," said Alice, "whether you
        can make words mean so many different things."
        "The question is," said Humpty Dumpty,
        "which is to be master - that's all."
    """;
    

    但是,三个"字符的序列需要进行转义至少一个"以避免模仿结束分隔符:

    String code =
        """
        String text = """
        	A text block inside a text block
        """;
        """;
    
    1. 文本块连接

    可以在任何可以使用字符串的地方使用文本块。

    String code = "public void print(Object o) {" +
                """
                System.out.println(Objects.toString(o));
                }
                """;
    

    简洁替换变量的方法:

    String code = """
                public void print($type o) {
                	System.out.println(Objects.toString(o));
                }
                """.replace("$type", type);
    
    String code = String.format("""
                public void print(%s o) {
                	System.out.println(Objects.toString(o));
                }
                """, type);
    

    String :: formatted:

    String source = """
    public void print(%s object) {
    System.out.println(Objects.toString(object));
    }
    """.formatted(type);
    
  • 相关阅读:
    【18焦作网络赛 J】 大数开方
    最小圆覆盖
    高斯消元
    回文自动机 PAM
    后缀自动机 SAM
    后缀数组 SA
    左偏树(可并堆)
    动态树LCT(Link-Cut-Tree)
    职场自我推销10大金点子
    数据库笔记
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/11845039.html
Copyright © 2020-2023  润新知