首页 > 其他分享 >记录jdk17相对于jdk8增加的一下主要语法糖和新特性

记录jdk17相对于jdk8增加的一下主要语法糖和新特性

时间:2023-11-15 16:45:57浏览次数:30  
标签:Java jdk17 System 语法 println jdk8 sealed var public

  jdk17 发布已经好久了,作为java的长期支持版本,引入了许多有趣且实用的新特性。这些特性不仅提高了开发效率,还增强了语言的表现力和安全性。并且是SpringBoot 3.0以后版本的硬性要求,之后势必会是java开发的主要版本。

  经过我个人的测试体验,在 Java 17 环境中运行使用早期 Java 版本(如 Java 8)编写的代码和库通常是没有问题的。这里简单记录一下jdk17 相比较与jdk8的主要不同点

1. 局部变量类型推断(Java 10)

 

  • var 关键字:可以在局部变量声明中使用 var,而无需显式声明数据类型。Java 编译器会根据变量的初始化值推断其类型。  
  var list = new ArrayList<String>(); // 无需显式指定类型

  

2. Lambda 参数的局部变量语法(Java 11)

  • Lambda 表达式中的 var:允许在 Lambda 表达式的参数中使用 var,使得可以为参数添加注解。

    (var x, var y) -> x.process(y)

3. 文本块(Java 13,正式在 Java 15)

  • 多行字符串文字:简化了多行字符串的处理,使用三个双引号来界定。

  • 好处:简化了多行字符串的处理,特别是在处理 JSON、HTML 或 SQL 时。
String json = """
              {
                  "name": "John",
                  "age": 30
              }
              """;

4. switch 表达式(Java 14,正式在 Java 17)

  • 扩展的 switchswitch 可以作为表达式使用,并支持 yield 语句返回值。

     Integer day = 2;
        String result = switch (day) {
            case MONDAY, FRIDAY, SUNDAY -> "Weekend";
            case TUESDAY, THURSDAY, SATURDAY -> "Weekday";
            default -> throw new IllegalStateException("Invalid day: " + day);
        };

        System.out.println("现在是" + result);

5. 模式匹配 instanceof(Java 16)

  • 模式匹配:改进 instanceof 操作,直接在条件判断中声明变量。

if (obj instanceof String s) {
    // 可以直接使用 s
    System.out.println(s);    
}

6. 记录类型(Java 16,正式在 Java 17)

  • record 关键字:用于声明不可变的数据对象,自动为您生成构造器、访问器、equalshashCodetoString 方法。

  • 不可变性:记录实例的状态是不可变的,一旦创建,其字段值就不能更改。
  • 数据载体:记录被设计为简单的数据载体,用于传输数据,不推荐在其中添加复杂的业务逻辑。
//record类
public record User(String name, int age) {
}

使用Record声明的User类

 public static void main(String[] args) {

    User user = new User("张三", 18, "北京市朝阳区");
        System.out.println(user.address());
        System.out.println(user.name());
        System.out.println(user.age());


    }

7. 密封类(Java 17)

  • 密封类:允许类或接口限制哪些其他类或接口可作为其子类或实现者(sealed, permits 关键字)。

  • 受限的继承:密封类允许您明确指定哪些其他类可以继承或实现它。
  • 保证的穷举性:密封类的一个关键优点是它们使得类型检查可以是穷尽的,特别是在使用模式匹配的 switch 表达式时。
  • 使用方法

    1. 声明密封类:在类或接口声明中使用 sealed 关键字,然后使用 permits 关键字指定允许扩展或实现该类或接口的所有直接子类。

public sealed class Shape permits Circle, Square, Rectangle {
    // ...
}

  指定子类:子类必须选择如何继承密封类,它们可以是 final(不能被进一步继承)、sealed(指定其自己的子类)或 non-sealed(允许开放继承)。

public final class Circle extends Shape { /*...*/ }
public sealed class Rectangle extends Shape permits FilledRectangle, EmptyRectangle { /*...*/ }
public non-sealed class Square extends Shape { /*...*/ }

 

 

标签:Java,jdk17,System,语法,println,jdk8,sealed,var,public
From: https://www.cnblogs.com/seizedays/p/17834173.html

相关文章

  • js基本语法规范
    1.在js中,双引号引起来的,就是字符串。2.JavaScript中的变量变量可以由任意顺序的大小美元符号$组成,但不能以数字开头,,不能是JavaScript中的保留关键字合法标识符举例:indentifier、username、user_name、_userName、$username非法的标识符举例:int、98.3、Helloworld3.JaveScrip......
  • 【转】JDK8 升级 JDK11 最全实践干货来了 | 京东云技术团队
    原文地址:JDK8升级JDK11最全实践干货来了|京东云技术团队作者:京东云开发者1.前言截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本。那么从JDK8到JDK11,到底带来了哪些特性呢?值得我们升级吗?而且升级过程会......
  • 箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 n
    请问以下JS代码最终输出的结果和num值分别是多少?vartest=(function(){varnum=0return()=>{returnnum++}}())for(vari=0;i<20;i++){test()}console.log(test());A20、20B20、21C21、21D21、20正确答案:Btest函数的作用就是......
  • 【转】JDK11 升级 JDK17 最全实践干货来了 | 京东云技术团队
    原文地址:JDK11升级JDK17最全实践干货来了|京东云技术团队原文作者:京东云开发者1.前言上篇文章给大家带来了JDK8升级JDK11的最全实践,相信大家阅读后已经对JDK11有了比较深入的了解。2021年9月14日,Oracle发布了可以长期支持的JDK17版本,那么从JDK11到JDK17,......
  • Python学习一基础语法3——input的应用和注释
    #语法结构:input("提示信息")提示信息是告诉用户需要你做什么name=input("请输入您的姓名:")print('您的姓名是:'+name)num=input('请输入您的幸运数字:')print('您的幸运数字是:'+num)#能够链接成功,说明num是字符串类型'''这是多行注释print能用连接符链接的是......
  • Markdown语法学习笔记
    MyFirstMarkdownFile(Markdown常用语法总结)文章标题文字前以#数量为一级、二级、三级、四级标题,例如本文标题,我使用了:#MyFirstMarkdownFile(Markdown常用语法总结)同样的,SecondTitle(##二级标题)ThirdTitle(###三级标题)FourthTitle(####四级标题)正文文字直......
  • shell 语法介绍
    大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就能够看懂了,一些比较高级的语法可以遇到的时候再去学习。我认为学习一门编程语言语法的时候,最基......
  • 编译原理-至下而上的语法分析
    目录至下而上分析的基本问题归约短语规范归约符号栈的使用算符优先分析优先关系算符文法及优先关表构造如何求FIRSTVT和LASTVT算符优先分析算法优先函数至下而上分析的基本问题归约用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,......
  • JDK11->JDK17问题记录一(又jenkins使用问题记录一)
    背景:springboot项目jdk版本从11升级至17,本地打包编译OK,将代码提交至gerrit仓库时触发编译报错,错误如下:09:29:02[ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile(default-compile)onprojectXXX:Fatalerrorcompiling:inva......
  • bat批处理常用系统信息、命令、语法、示例
    Windows下使用批处理设置东西,是很方便的事。一、获取系统信息1.获取CPU信息echo%PROCESSOR_ARCHITECTURE:~%系统CPU是AMD牌子,64位的1.1)获取CPU品牌echo%PROCESSOR_ARCHITECTURE:~0,3%1.2)获取CPU位数echo%PROCESSOR_ARCHITECTURE:~3%或echo%PROCESSOR_ARCHITEC......