• 1、文本块

    在Java17之前的版本里,如果我们需要定义一个字符串,比如一个JSON数据,基本都是如下方式定义:

    public void lowVersion() {
        String text = "{n" +
            "  "name": "小黑说Java",n" +
            "  "age": 18,n" +
            "  "address": "北京市西城区"n" +
            "}";
        System.out.println(text);}

    这种方式定义具有几个问题:

    • 双引号需要进行转义;

    • 为了字符串的可读性需要通过+号连接;

    • 如果需要将JSON复制到代码中需要做大量的格式调整(当然这一点也可以通过其他工具解决);

    通过Java 17中的文本块语法,类似的字符串处理则会方便很多;通过三个双引号可以定义一个文本块,并且结束的三个双引号

    不能和开始的在同一行。

    上面例子中的JSON可以更方便,可读性更好的通过文本块定义。代码如下:

    private void highVersion() {
        String text = """
                {
                  "name": "小黑说Java",
                  "age": 18,
                  "address": "北京市西城区"
                }
                """;
        System.out.println(text);}

    这段代码的输出结果是:

    {
      "name": "小黑说Java",
      "age": 18,
      "address": "北京市西城区"}





  • 2、switch表达式

    Java 17版本中switch表达式将允许switch有返回值,并且可以直接作为结果赋值给一个变量,等等一系列的变化。

    下面有一个switch例子,依赖于给定的枚举值,执行case操作,故意省略break。

    {0EE9EA94-F528-4451-A8C7-5848FD569594}.png

    我们调用这个方法传入一个APPLE,会输出以下结果:

    {B6FEA5E9-DF62-40F3-B4E6-B71AB9BC9502}.png

    显然这不是期望的结果,因为我们需要在每个case里添加break防止所有的case都没执行。

    {CEF6C573-DD98-4325-9BFE-496BF64DE330}.png

    switch表达式也可以返回一个值,比如上面的例子我们可以让switch返回一个字符串来表示我们要打印的文本。需要注意在switch语句的最后要加一个分号。

    {2F25C948-A7A9-4288-824C-3A4F8F329A0F}.png

    也可以直接省略赋值动作直接打印。

    {78B4DB1F-6DB0-4155-BF95-F4644651F631}.png

    如果你想在case里想做不止一件事,比如在返回之前先进行一些计算或者打印操作,可以通过大括号来作为case块,最后的返回值使用关键字yield进行返回。

    {8AC3ADB9-7072-467C-900F-AD5EAB720DD8}.png

    这个输出结果是:

    {BF2CE78C-FF6A-4795-9C47-C0C5A232FC94}.png

    当然也可以直接使用yield返回结果。

    {51CFFDBD-1000-4AF4-9038-E57FA02E7C3A}.png



  • 3、record关键字

    record用于创建不可变的数据类。在这之前如果你需要创建一个存放数据的类,通常需要先创建一个Class,然后生成构造方法、getter、setter、hashCode、equals和toString等这些方法,或者使用Lombok来简化这些操作。

    比如定义一个Person类:

    {35A195F2-1327-49E7-B9C3-7CEA70FF0DCD}.png

    我们来通过Person类做一些测试,比如创建两个对象,对他们进行比较,打印这些操作。

    {77F6ACAC-CD7C-463C-B920-D3EC483B2D42}.png

    假设有一些场景我们只需要对Person的name和age属性进行打印,在有record之后将会变得非常容易。

    {7D53AF89-B27D-4577-AFC2-859E4A99A426}.png

    record也可以单独定义作为一个文件定义,但是因为Record的使用非常紧凑,所以可以直接在需要使用的地方直接定义。

    {5EEF6E8F-A2B2-4875-A7FF-C1F7B38A0CB2}.png

    record同样也有构造方法,可以在构造方法中对数据进行一些验证操作。

    {58099C5F-46D5-430F-A3CB-6E8C383CE958}.png