Java12到17的新特性有哪些

发布时间:2022-02-28 10:17:48 作者:iii
来源:亿速云 阅读:149

这篇“Java12到17的新特性有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java12到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 表达式

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

文本块

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

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

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

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

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

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

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

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

结果在以下字符串中:

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

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

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

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

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

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

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

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

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

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

打包工具

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

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

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

生成的包还包含运行应用程序所需的 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) { }

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

// 规范构造函数
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 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列表中的每个子类或接口都必须使用以下修饰符之一:

以上就是关于“Java12到17的新特性有哪些”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

推荐阅读:
  1. AndroidStudio升级到3.0的新特性和注意事项有哪些
  2. 总结C++17的新特性

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java命名规范的内容有哪些

下一篇:怎么使用css3简单制作进度条

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》