JDK15新特性:文本块的引入和使用

Text Blocks首次是在JDK 13中以预览功能出现的,然后在JDK 14中又预览了一次,终于在JDK 15中被确定下来,可放心使用了。

文本块是一种多行字符串文字,它避免了大多数转义序列的需要,以一种可预测的方式自动设置字符串的格式,并在需要时使开发人员可以控制格式,简化编写 Java 程序的任务。

文本块建议的目标是提高 Java 程序中的字符串的可读性,这些字符串表示以非 Java 语言编写的代码。

另一个目标是支持从字符串文本迁移,规定任何新构造都可以表达与字符串文本相同的字符串集,解释相同的转义序列,并且以与字符串文本相同的方式进行操作。OpenJDK 开发人员希望添加转义序列来管理显式空白和换行控件。

在Java中,在字符串文字中嵌入HTML,XML,SQL或JSON片段,通常需要先进行转义和串联的大量编辑,然后才能编译包含该片段的代码。该代码段通常难以阅读且难以维护,因此,如果具有一种语言学机制,可以比多行文字更直观地表示字符串,而且可以跨越多行,而且不会出现转义的视觉混乱,那么这将提高广泛Java类程序的可读性和可写性。从JDK13到JDK14开始文本块新特性的提出,提高了Java程序书写大段字符串文本的可读性和方便性。

文本块作为预览特性首次引入Java 13后收到了众多最终用户的反馈。现在,文本块得到了增强,再次作为预览特性出现在Java 14中,目标成为未来JDK版本的标准特性。使用文本块可以轻松表达跨多行源代码的字符串。它提高了Java程序中以非Java语言编写的代码的字符串的可读性;它约定,任何新构造的文本块都可以用字符串相同的字符集表示,解释相同的转义序列并以与字符串相同的方式进行操作。下面看文本块的引入方法和字符串的区别和不同:
使用“一维”字符串引入Hello, world 文字

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

使用“二维”文本块引入Hello, world 文字

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;
    
System.out.println("""
    Hello,
    itheima
    text blocks!
    """);

文本块是Java语言的新语法,可以用来表示任何字符串,具有更高的表达能力和更少的复杂度。文本块的开头定界符是由三个双引号 """ 开始,从新的一行开始字符串的内容。这里的新起的这行不属于字符串,只表示内容开始,是语法的一部分。以 """结束。 """可以紧跟字符串内容,也可以另起一行。另起一行时,字符串内容最后会留有一新行。

line 1
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"""

等效于字符串文字:

"line 1\nline 2\nline 3"

文本块可以表示空字符串,尽管不建议这样做,因为它需要两行源代码:

String empty = """
""";

以下是一些格式错误的文本块的示例:

String a = """""";   // no line terminator after opening delimiter
String b = """ """;  // no line terminator after opening delimiter
String c = """
           ";        // no closing delimiter (text block continues to EOF)
String d = """
           abc \ def
           """;      // unescaped backslash (see below for escape processing)

使用原始字符串语法:

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

使用文本块文本块语法:

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

使用原始的字符串语法:

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

使用文本块语法:

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

多语言示例

使用原始的字符串语法:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("function hello() {\n" +
                         "    print('\"Hello, world\"');\n" +
                         "}\n" +
                         "\n" +
                         "hello();\n");

使用文本块语法:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
Object obj = engine.eval("""
                         function hello() {
                             print('"Hello, world"');
                         }
                         
                         hello();
                         """);

java编译器会自动删除不需要的缩进:

- 每行结尾的空格都会删除

- 每行开始的共有的空格会自动删除

- 只保留相对缩进。

System.out.println("""
    Hello,
    itheima
    text blocks!
    """);
// 结果
// > Hello,
// > itheima
// > text blocks!
// >

System.out.println("""
    Hello,
      itheima
    text blocks!
    """);
// 结果
// > Hello,
// >   itheima
// > text blocks!
// >

- 新行"""结束时,将"""向左调整,则可以给所有行前加相应数量的空格。将"""向右调整,没有作用。

System.out.println("""
        Hello,
        multiline
        text blocks!
    """);
// 结果
// >     Hello,
// >     multiline
// >     text blocks!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是JDK2到JDK17每个版本的主要新特性功能和改动内容: JDK2:引入了JavaBeans、JDBC、JAR、RMI等技术,使得Java更加易于开发使用JDK3:引入了Java Server Pages(JSP)和Java Message Service(JMS)等技术,使得Java在Web应用和消息传递方面更加强大。 JDK4:引入了NIO、Java Web Services(JWS)、Java Management Extensions(JMX)等技术,使得Java在网络编程和系统管理方面更加出色。 JDK5:引入了泛型、自动装箱/拆箱、枚举类型、注解、可变参数等特性,使得Java语言更加强大。 JDK6:引入了JDBC 4.0、Java Compiler API、Java Web Start等技术,使得Java在数据库访问、编译和应用启动方面更加高效。 JDK7:引入了switch语句支持字符串类型、try-with-resources语句、Diamond语法、Fork/Join框架等特性,使得Java语言更加易于使用和高效。 JDK8:引入了Lambda表达式、Stream API、Date/Time API等特性,使得Java在函数式编程、数据处理和日期处理方面更加强大。 JDK9:引入了模化系统、JShell、多版本兼容性等特性,使得Java在模化、交互式开发和版本管理方面更加出色。 JDK10:引入了局部变量类型推断、线程局部变量回收等特性,使得Java语言更加简洁和高效。 JDK11:引入了HTTP客户端API、ZGC垃圾回收器等特性,使得Java在网络编程和性能方面更加优化。 JDK12:引入了Switch表达式、JVM常量API等特性,使得Java语言更加易于使用和扩展。 JDK13:引入文本、动态CDS等特性,使得Java在字符串处理和性能方面更加出色。 JDK14:引入了Switch表达式增强、Records、Pattern Matching for instanceof等特性,使得Java语言更加简洁和易于使用JDK15引入了Sealed Classes、Text Blocks、Hidden Classes等特性,使得Java在类设计和字符串处理方面更加出色。 JDK16:引入了Records增强、Vector API、Foreign Linker API等特性,使得Java在数据处理和性能方面更加优化。 JDK17:引入了Pattern Matching for switch增强、Sealed Classes增强、Foreign-Memory Access API等特性,使得Java语言更加易于使用和高效。同时,JDK17还引入了一些性能和安全方面的改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值