设为首页 加入收藏

TOP

JDK8到JDK17有哪些吸引人的新特性?(七)
2023-07-25 21:31:34 】 浏览:98
Tags:JDK8 JDK17
ystem.out.println(9); }

还可以把switch语句当成一个表达式来处理:

T result = switch (arg) {
    case L1 -> e1;
    case L2 -> e2;
    default -> e3;
};

static void howMany(int k) {
    System.out.println(
        switch (k) {
            case  1 -> "one";
            case  2 -> "two";
            default -> "many";
        }
    );
}

还可以配合关键字yield,在复杂处理场景里,返回指定值:

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result;
    }
};

还有吗?其实在JDK17中,还提出了Swtich 模式匹配的预览功能,可以做到更优雅的条件判断:

// 优化前
static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}
// 优化后
static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

五、字符串压缩-Compact Strings(JEP254

字符串是我们日常编程中使用最频繁的基本数据类型之一。目前,字符串类底层都使用了一个字符数组来实现,每个字符使用2个字节(16位)空间。实际上,大量的字符都属于Latin-1字符范围内,我们只需要一个字节就能存储这些数据,因此这里有巨大的可压缩空间;SPECjbb2005压测结果显示对于GC时间及GC时间间隔都有一定程度的提升。详细原理文档也可以参考【Oracle对CompackStrings分享

六、 Java Flow API

Reactive Streams是一套非阻塞背压的异步数据流处理规范。从Java9开始,Java原生支持Reactive Streams编程规范。Java Flow API是对Reactive Streams编程规范的1比1复刻,同时意味着从Java9开始,JDK本身开始在Reactive Streams方向上进行逐步改造。

七、新一代JIT编译器 Graal

即时编译器在提高JVM性能上扮演着非常重要的角色。目前存在两JIT编译器:编译速度较快但对编译后的代码优化较低的C1编译器;编译速度较慢但编译后的代码优化较高的C2编译器。两个编译器在服务端程序及分层编译算法中扮演着非常重要的角色。但是,C2编译器已经存在将近20年了,其中混乱的代码以及部分糟糕的架构使其难以维护。JDK10推出了新一代JIT编译器Graal(JEP317)。Graal作为C2的继任者出现,完全基于Java实现。Graal编译器借鉴了C2编译器优秀的思想同时,使用了新的架构。这让Graal在性能上很快追平了C2,并且在某些特殊的场景下还有更优秀的表现。遗憾的是,Graal编译器在JDK10中被引入,但是在JDK17(JEP410)中被废除了,理由是开发者对其使用较少切维护成本太高。开发者也可以通过使用GraalVM来使用Graal编译器;

总结

本文介绍了JDK9-JDK17升级过的近200个JEP中作者狭隘角度认为价值较高的功能做了一个综述类介绍。主要目的有两个:

  1. 通过本文,大家可以对即将使用的JDK11及JDK17新特性有一个笼统的了解,希望可以看到一些Java预发最近几年的发展方向。

  2. 通过本文也可以看出,从JDK9到JDK17,Java生态还是生机勃勃。大量功能的更新意味着更优秀的性能及更高效的开发效率,积极主动的尝试高版本JDK;
    当然,JDK8到JDK17还有需求优秀的新特性,例如:shanondoah垃圾回收器Sealed ClassesRecords
    鉴于本人能力有限,文中会出现一些漏洞,希望大家找出并指正,让本文成长为后续JDK17升级的扫盲手册;

首页 上一页 4 5 6 7 下一页 尾页 7/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java--IO流 ? 字节流 下一篇Nexus搭建maven仓库并使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目