首页 > 编程语言 >java5至java17新特性总结(开发相关)

java5至java17新特性总结(开发相关)

时间:2022-11-18 18:31:09浏览次数:64  
标签:java17 String Point System 特性 java5 println 文本 out


目录

​​一、JAVA5~11(图片版)​​

​​二、JAVA12~17(文字版)​​

​​开关表达式​​

​​文本块​​

​​打包工具​​

​​Instanceof 的模式匹配​​

​​记录​​

​​密封类​​


一、JAVA5~11(图片版)

java5至java17新特性总结(开发相关)_java

 

java5至java17新特性总结(开发相关)_双引号_02

java5至java17新特性总结(开发相关)_双引号_03

java5至java17新特性总结(开发相关)_java_04

二、JAVA12~17(文字版)

​参考:从 Java 12 到 17 的新特性 | w3c笔记​

Java 11(迄今为止的最后一个长期支持版本)三年后,Java 17 LTS 将于 2021 年 9 月发布。是时候快速浏览一下开发人员从 11 升级到 17 后可以享受的新功能了。请注意,在幕后进行了更多改进。本文重点介绍大多数开发人员可以直接使用的功能:

开关表达式

switch 现在可以返回一个值,就像一个表达式:

// 将给定 planet 的 group 分配给一个变量
String group = switch(planet){
case MERCURY, VENUS, EARTH, MARS -> "内行星";
case JUPITER, SATURN, URANUS, NEPTUNE -> "外行星";
}

如果单个 case 的右侧需要更多代码,则可以将其写入块中,并使用​​yield​​以下方法返回值:

// 打印给定 planet 的 group,以及更多信息
// 并将给定 planet 的 group 分配给一个变量
String group = switch(planet){
case EARTH, MARS -> {
System.out.println("内行星");
System.out.println("主要由岩石组成");
yield "内部的";
}
case JUPITER, SATURN -> {
System.out.println("外行星");
System.out.println("主要由气体组成");
yield "外部的";
}
}

但是,使用新的箭头标签进行切换不需要返回值,就像 void 表达式一样:

// 打印给定 planet 的 group
// 不返回任何东西
switch(planet){
case EARTH, MARS -> System.out.println("内行星");
case JUPITER, SATURN -> System.out.println("外行星");
}

与传统的 switch 相比,新的 switch 表达式

  • 使用“->”代替“:”
  • 每个案例允许多个常量
  • 没有贯穿语义(即,不需要中断)
  • 使在 case 分支中定义的变量本地化到这个分支

此外,编译器保证了 switch 的详尽性,因为只有一种情况被执行,这意味着要么

  • 所有可能的值都被列为案例(如上面的枚举由八个行星组成)
  • 必须提供“默认”分支

文本块

文本块允许编写包含双引号的多行字符串,而无需使用​​\n​​​或​​\"​​转义序列:

String block = """
可以输入多行文本内容
可以缩进
可以带有“双引号”!
"""

文本块由三个双引号​​"""​​和一个换行符打开,并由三个双引号关闭。

Java 编译器应用智能算法从结果字符串中去除前导空格,使得

  • 删除了仅与更好的 Java 源代码可读性相关的缩进
  • 与字符串本身相关的缩进保持不变

在上面的示例中,结果字符串如下所示,其中每个都​​.​​标记一个空格:

..可以输入多行文本内容
....可以缩进
......可以带有“双引号”!

想象一个跨越文本块高度的垂直条,从左到右移动并删除空格,直到它接触到第一个非空格字符。结束文本块分隔符也很重要,因此将其向左移动两个位置。

String block = """
可以输入多行文本内容
可以缩进
可以带有“双引号”!
"""

结果在以下字符串中:

可以输入多行文本内容
..可以缩进
....可以带有“双引号”!

此外,每一行的尾随空格都会被删除,这可以通过使用新的转义序列来防止​​\s​​。

文本块内的换行符可以转义:

String block = """
请 \
不要 \
插队 \
, \
谢谢 \
"""

结果在以下字符串中,没有任何换行符:

请.不要.插队.,.谢谢

或者,也可以通过将结束定界符直接附加到字符串的末尾来删除最后的换行符

String block = """
没有最终的断线
在这个字符串的末端"""

将变量插入文本块可以像往常一样使用静态方法​​String::format​​​或新的实例方法​​String::formatted​​来完成,写起来要短一些:

String block ="""
%s 标记位置.
""".formatted("x");

打包工具

假设您​​demo.jar​​​在​​lib​​目录中有一个 JAR 文件,以及其他依赖项 JAR。以下命令

jpackage --name demo --input lib --main-jar demo.jar --main-class demo.Main

将此演示应用程序打包为与您当前平台相对应的本机格式:

  • Linux:deb 或 rpm
  • Windows:msi 或 exe
  • macOS:pkg 或 dmg

生成的包还包含运行应用程序所需的 JDK 部分以及本机启动器。这意味着用户可以以特定于平台的标准方式安装、运行和卸载应用程序,而无需事先明确安装 Java。

不支持交叉编译:如果需要 Windows 用户的包,必须在 Windows 机器上用 jpackage 创建。

可以使用更多选项自定义包创建,这些选项记录在​​jpackage 手册页上​​。

Instanceof 的模式匹配

模式匹配​​instanceof​​消除了在类型比较后执行强制转换的样板代码:

Object o = "字符串伪装成对象";
if (o instanceof String s){
System.out.println(s.toUppperCase());
}

在上面的示例中,新变量的范围​​s​​​直观地限于​​if​​分支。准确地说,变量在保证模式匹配的范围内,这也使以下代码有效:

if (o instanceof String s && !s.isEmpty()){
System.out.println(s.toUpperCase());
}

反之亦然

if (!(o instanceof String s)){
throw new RuntimeException("excepting string");
}
// s 在此范围内!
System.out.println(s.toUpperCase());

记录

记录减少了作为简单数据载体的类的样板代码:

record Point(int x, int y) { }

这个单行产生一个自动定义的记录类

  • x 和 y 的字段(私有和最终)
  • 所有字段的规范构造函数
  • 所有领域的​​Getters​
  • ​equals​​​, ​​hashCode​​​, 和​​toString​​(考虑所有字段)
// 规范构造函数
Point p = new Point(1, 2);
// getters - 没有'get'前缀
p.x();
p.y();

// equals, hashCode, toString
p.equals(new Point(1, 2)); // true
p.hashCode(); // 依赖于x和y的值
p.toString(); // Point[x=1,y=2]

记录类的一些最重要的限制是它们

  • 是不可变的(因为它们的字段是私有的和最终的)
  • 是隐式最终的
  • 无法定义其他实例字段
  • 总是扩展​​Record​​类

然而,也可以:

  • 定义其他方法
  • 实现接口
  • 自定义规范构造函数和访问器
record Point(int x, int y) {
// 显示规范构造函数
Point {
// 自定义验证
if (x < 0 || y < 0)
throw new IllegalArgumentException("no negative points allowed");
// 自定义调整(通常违背直觉)
x += 1000;
y += 1000;
// 对字段的赋值在最后自动法僧
}
// 显示访问器
public int x() {
// 自定义的代码
return this.x;
}
}

此外,可以在方法中定义本地记录:

public void withLocalRecord() {
record Point(int x, int y) { };
Point p = new Point(1, 2);
}

密封类

密封类明确列出允许的直接子类。其他类不得从此类扩展:

public sealed class Parent
permits ChildA, ChildB, ChildC { ... }

同样,密封接口明确列出允许的直接子接口和实现类:

sealed interface Parent
permits ChildA, ChildB, ChildC { ... }

列表中的类或接口​​permits​​必须位于同一个包中(如果父模块位于命名模块中,则位于同一个模块中)。

所述​​permits​​,如果亚类(或接口)位于同一文件内,可以省略列表:

public sealed class Parent {
final class Child1 extends Parent {}
final class Child2 extends Parent {}
final class Child3 extends Parent {}
}

​permits​​列表中的每个子类或接口都必须使用以下修饰符之一:

  • final(不允许进一步扩展;仅用于子类,因为接口不能是最终的)
  • 密封(允许进一步、有限的扩展)
  • 非密封(允许再次无限扩展)

标签:java17,String,Point,System,特性,java5,println,文本,out
From: https://blog.51cto.com/lishuoboy/5868906

相关文章

  • java8 (jdk 1.8) 新特性——Lambda
    java8(jdk1.8)新特性——初步认识  1.什么是lambda?目前已知的是,有个箭头  ->  说一大段官方话,也没有任何意义我们直接看代码:之前我们创建线程是这样的......
  • MySQL8.0新特性—InnoDB增强
    1.自增变量持久化在MySQL8.0之前的版本中,自增列计数器置于内存中,并不会持久化到磁盘,当数据库重启后,会根据selectmax(id)+1fromxxx重新计算当前自增列值,这种现象在某些......
  • Java新特性(2):Java 10以后
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 虽然到目前为止Java的版本更新还没有什么惊天动地的改变,但总是会冒出一些有趣的小玩意。前面列举了Java9和Java10的一些......
  • Java8新特性之lambda表达式
    1.1Java8的概述Java8于2014年3月发布,该版本是Java语言的一个重要版本,自Java5以来最具革命性的版本,该版本包含语言、编译器、库、工具和JVM等方面的多个新特性。1.2......
  • CTFshow刷题日记-WEB-PHP特性(下篇123-150)
    web123,125,126error_reporting(0);highlight_file(__FILE__);include("flag.php");$a=$_SERVER['argv'];$c=$_POST['fun'];if(isset($_POST['CTF_SHOW'])&&isset($_POST['C......
  • Java新特性(1):Java 9和Java10
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 自从Java在2009年被Oracle收购之后,就不再开源,除了Oracle官方发布的版本之外,还有OpenJDK版本,这两者的区别可以自行找某度......
  • Javascript(笔记40) - ES6特性 - Map
    Javascript(笔记40)-ES6特性-MapMap ES6 提供了Map数据结构。它类似于对象,也是键值对集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实......
  • Javascript(笔记39) - ES6特性 - 集合Set
    SETES6 提供了新的数据结构set(集合)。集合类似于数组,但成员的值都是唯一的,集合实现iterator 接口,所以可以使用“扩展运算符”和“for...of”进行遍历,集合的属性和方法......
  • Java8 新特性
    Java8新特性 Java8新特性之Lambda和Stream(一)Lambda#1.what?#Lambda是java8的一个新特性,可以大幅度减少代码量;关注于"做什么",而不是"怎么做",可以通过匿名......
  • FastJson循环引用特性
    FastJson在序列化集合时,若集合循环引用特性packagecom.yang;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.TypeReference;importcom.alibaba.f......