首页 > 编程语言 >java17新特性简单介绍

java17新特性简单介绍

时间:2024-03-08 22:00:22浏览次数:34  
标签:java17 String void 特性 public static 简单 main class

前言

本项目使用的 IDE 为 IDEA 2023.3.3(社区版)。

文本块

java17之前的写法,双引号需要转义,换行需要\n,需要加号拼接

public class TestString {
    public static void main(String[] args) {
        String json = "{\n" +
                "  \"id\": \"1\",\n" +
                "  \"name\": \"菜鸟教程\",\n" +
                "  \"url\": \"www.runoob.com\"\n" +
                "}";
        System.out.println(json);
    }
}

java17的写法,可读性更好,一目了然。

public class TestString {
    public static void main(String[] args) {

        String json = """
                {
                  "id": "1",
                  "name": "菜鸟教程",
                  "url": "www.runoob.com"
                }
                """;
        System.out.println(json);
    }
}

像传统的字符串一样,文本块是字符串的一种常量表达式。不同于传统字符串的是,在编译期,文本块要顺序通过如下三个不同的编译步骤:

  1. 为了降低不同平台间换行符的表达差异,编译器把文本内容里的换行符统一转换成 LF(\u000A);
  2. 为了能够处理Java源代码里的缩进空格,要删除所有文本内容行和结束分隔符共享的前导空格,以及所有文本内容行的尾部空格;
  3. 最后处理转义字符,这样开发人员编写的转义序列就不会在第一步和第二步被修改或删除。

通过反编译可以看到,文本块本质上也是语法糖。

switch表达式

java17之前的写法,必须要加break

public class TestSwitch {
    public static void main(String[] args) {
        test("+",5,6);
    }

    private static void test(String sign, int num1, int num2) {
        int ret = 0;
        switch (sign) {
            case "+":
                ret = num1 + num2;
                break;
            case "-":
                ret = num1 - num2;
                break;
            case "*":
                ret = num1 * num2;
                break;
            case "/":
                ret = num1 / num2;
                break;
            default:
                break;
        }
        System.out.println("ret: " + ret);
    }
}

java17的写法,switch必须覆盖所有可能的情况,如果是枚举,就必须包含所有值

public class TestSwitch {
    public static void main(String[] args) {
        test1("*", 5, 6);
    }

    private static void test1(String sign, int num1, int num2) {
        int ret = switch (sign) {
            case "+" -> {
                System.out.println("this is add");
                yield num1 + num2;// 下面的是简化写法
            }
            case "-" -> num1 - num2;
            case "*" -> num1 * num2;
            case "/" -> num1 / num2;
            default -> throw new IllegalStateException("Unexpected value: " + sign);
        };
        System.out.println("ret: " + ret);
    }
}

本质上也是编译器的语法糖

record类

public class TestRecord {
    public static void main(String[] args) {
        Person person = new Person("lisi", "123");
        System.out.println(person.username());// 不是标准的 getter
        System.out.println(person);
    }

    public record Person(String username,String password){

    }
}

会帮我们生成构造器,toString()方法,equals()方法,对象不可变,没有 setter 及标准的 getter,功能不如 lombok 强大。

密封类

在这之前一个类要么是可以被extends的,要么是final的,只有这两种选项。密封类可以控制有哪些类可以对超类进行继承。子类需要指明它是final,non-sealed或sealed的,父类不能控制子类是否可以被继承。

public class TestSealed {
    public static void main(String[] args) {
        new TestSealed().test();
    }
    public void test() {
        Animal animal = new WildPig();
        System.out.println(animal);
    }

    /**
     * 动物
     */
    sealed class Animal permits Dog, Cat, Pig {
    }

    /**
     * 狗
     */
    final class Dog extends Animal {
    }

    /**
     * 猫
     */
    non-sealed class Cat extends Animal {
    }

    /**
     * 猪
     */
    sealed class Pig extends Animal permits WildPig {
    }

    /**
     * 野猪
     */
    final class WildPig extends Pig {
    }

}

instanceof模式匹配

java17之前必须手动进行类转换

public class TestInstanceOf {
    public static void main(String[] args) {
        test1("hello");
        test1(123);
    }

    private static void test1(Object obj) {
        if (obj instanceof String) {
            int length = ((String) obj).length();
            System.out.println(length);
        }
    }
}

java17可以简写

public class TestInstanceOf {
    public static void main(String[] args) {
        test1("hello");
    }

    private static void test1(Object obj) {
        if (obj instanceof String str) {
            System.out.println(str.length());
        }
    }
}

空指针异常打印增强

import lombok.Data;

public class TestNullPointerException {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.getAddress().getProvince().getCode());
    }

    @Data
    private static class Person {
        private Address address;
    }

    @Data
    private static class Address {
        private Province province;
    }

    @Data
    private static class Province {
        private String name;
        private String code;
    }
}

java17之前的异常信息如下,仅显示发生异常的行号,但不知道具体哪个方法调用时产生的异常,必须通过调试的方式找到。

Exception in thread "main" java.lang.NullPointerException
	at com.imooc.TestNullPointerException.main(TestNullPointerException.java:9)

java17的异常信息如下,会显示出现异常的精确位置。

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.imooc.TestNullPointerException$Address.getProvince()" because the return value of "com.imooc.TestNullPointerException$Person.getAddress()" is null
	at com.imooc.TestNullPointerException.main(TestNullPointerException.java:8)

Stream增强

java17之前

public class TestStream {
    public static void main(String[] args) {
        List<String> languages = Stream.of("java", "python").collect(Collectors.toList());
        System.out.println(languages);
    }
}

java17增加了一个 toList() 方法

public class TestStream {
    public static void main(String[] args) {
        List<String> languages = Stream.of("java", "python").toList();
        System.out.println(languages);
    }

}

矢量运算

private static void testFloatVector() {
        float[] data = {0.1f, 0.2f};
        FloatVector floatVector = FloatVector.fromArray(FloatVector.SPECIES_64, data, 0);
        System.out.println(floatVector.mul(floatVector));
    }

报错如下

java: package jdk.incubator.vector is not visible
  (package jdk.incubator.vector is declared in module jdk.incubator.vector, which is not in the module graph)

添加编译参数 --add-modules jdk.incubator.vector

还报错

Error: Unable to initialize main class com.imooc.TestFloatVector
Caused by: java.lang.NoClassDefFoundError: jdk/incubator/vector/Vector

添加运行时VM参数 --add-modules jdk.incubator.vector

运行结果为

[0.010000001, 0.040000003]

参考

Java 17的这些新特性不看后悔
深入剖析Java新特性-02文字块:怎么编写所见即所得的字符串?
java9系列(六)HTTP/2 Client (Incubator)
Linux和Windows下JDK17下载地址
Mac下JDK17下载地址

标签:java17,String,void,特性,public,static,简单,main,class
From: https://www.cnblogs.com/strongmore/p/18033370

相关文章

  • Spring-Boot AOP 的简单创建
    AOP切面1.导依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>定义一个切面类@Aspect@ComponentpublicclassAop......
  • MATLAB简单美化
    听着音乐......
  • Rails5中AR的新特性
    ApplicationRecord在Rails4中所有的模型都继承自ActiveRecord::Base,不过在Rails5中新引进了一个叫ApplicationRecord的类,存放在:app/models/application_record.rb中,所有Rails5应用都会有这个类,它的内容非常简单: 就是一个继承ActiveRecord::Base的抽象类,作用就是为整个应用......
  • CVPR2024 | Point Transformer V3: 更简单、更快、更强!
    前言 本文没有动机在注意力机制内寻求创新。相反,它专注于在点云处理的背景下克服现有的准确性和效率之间的权衡,利用scale的力量。从3D大规模表示学习的最新进展中汲取灵感,我们认识到模型性能更多地受到规模的影响,而不是复杂设计的影响。因此,本文提出了PointTransformerV3(PTv3),它......
  • 使用go写了一个简单的http接口
    使用go写了一个简单的http接口packagemainimport( "fmt" "net/http" "os/exec" "sync" "time")var( requestCountint lastTimestamptime.Time musync.Mutex)const( maxRequests=30 resetDu......
  • 制作简单的个人网页教程
     ##1.准备工作在开始制作个人网页之前,您需要确保已经安装了文本编辑器,比如SublimeText,VisualStudioCode等。接下来我们将使用HTML、CSS和JavaScript来制作该个人网页。##2.创建HTML文件首先,打开您的文本编辑器,创建一个新文件并将其保存为`index.html`。接下来,添加以下基......
  • FFU、WIM、ESD、VHD和VHDX都是与Windows操作系统部署、备份和虚拟化相关的文件格式。
    FFU(FullFlashUpdate)文件格式是微软开发的,用于在Windows设备上进行固件更新和完整系统部署的一种映像文件格式。FFU文件包含了设备的完整磁盘映像,包括所有分区、文件系统和数据。这种格式允许精确复制存储设备的内容,提供了一种高效且可靠的方式来恢复、更新或部署设备。下面是对F......
  • jdk21新特性
    jdk21新特性内容基本就是收集了下官方说明,然后自己汉化了下觉得有必要记录的。原文请看文章末尾编码字符集默认编码为UTF-8,而不是取用当前运行操作系统的编码。-Dfile.encoding=UTF-8可以不再设置JVM变更G1单块支持31M=>512MG1使用单标记bitmap类名检测1.4......
  • 02_简单工厂模式
    简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,属于工厂模式的一种。在简单工厂模式中,通过一个工厂类来负责创建对象实例,而客户端无需直接创建对象,只需要通过工厂类来获取所需的对象。简单工厂模式包含以下几个角色:工厂类(Factory):负责创建对象实例的类。产品类(Produc......
  • python进行数据下钻的简单测试——非正式版
    具体代码//这个是全国地图下钻到省市地图,我这里以湖南长沙为例:chart_d3a639f3511c48ba8020864474f8950d.on('click',function(param){varselected=param.name;if(selected){switch(selected){......