从JDK8到JDK17,需要注意的一些新特性_jdk8 jdk17-程序员宅基地

技术标签: java  JDK17  maven  intellij-idea  

这篇文章并非单一的介绍JDK17的新特性,而是将jdk8到jdk17之间所有新加入的特性进行了简单的汇总,罗列一系列重要的改动,以便从JDK8升级到JDK17.

先给大家推荐一个好玩的网站MyChatGPT(免梯子,国内直接用,不需要OpenAI账号):https://chat.icoding.ink/

模块化开发

这并非jdk17的新特性,模块化在jdk9中加入,模块化的好处就是开发者可以根据需要引用某个依赖的指定部分,而不是引入这个依赖的全部。以此达到减少体积以及提高编效率的目的。
看一个例子:

  1. 新建一个项目,并创建一个model1,在model1中编写以下两个java类,并创建module-info,对外纰漏com.gsk.module1.test1这个包
    module1
  2. 创建一个model2,在model2中引入model1,并尝试调用model1中的类
    module2
    如果熟悉前端开发的话,对此不难发现这些熟悉的modulerequiresexports等关键字。也更容易去掌握这其中的应用场景。但对于重度依赖maven的开发者来说,模块的概念用的可能不是很多。

JShell引擎

在JDK8中,对于一些复杂的动态、可编程的配置,可以使用Nashorn引擎去执行js代码,以达到动态变编程杂配置的目的,比如下面就是我开发的一套内部的工业系统的一部分,可以通过编写javascript脚本去快速的动态编程一些东西。
FVite-Script-Editor
但这个脚本引擎很久之前就被java移除了,JDK17中尽管可以使用第三方依赖库提供的引擎,但由于javascript更新越来越频繁、并且javascript中的对象模型与java存在差异,并不能完美的与java融合。因此你需要一个更强大的引擎, 那就是JShell

JShell也不是jdk17的特性,它同样在jdk9中被加入。JShell的出现,使得java的字节码代码可以像脚本语言一样去动态编程。

如果你的设备中安装了JDK9即以上的版本,可以在终端中输入jshell,进入JShell,并编写脚本进行测试,同时按tab键可以调出候补提示。

JShell

构建多版本兼容的jar

javac -d build --release 8 src/java/com/company/*.java
javac -d build17 --release 17 src/java17/com/company/*.java
jar --create --main-class=Test --file test.jar -C build . --release 17 -C build17 .

此时,让这个jar包在JDK8中运行时,执行的时src/java下编译的字节码,当这个jar包在JDK17上运行时则执行的是src/java17下编译的字节码。

需要注意的是,这个特性依然是在JDK9中就被引入了

接口的私有方法

在JDK17中,允许interface中携带private方法,这个private方法允许被自身default修饰的方法调用。

public interface Test{
    
	default test1(){
    
		Test2();
	}
	private void test2(){
    
		System.out.printin(“hello”)
	}
}

String底层变更

在以前的String底层是一个char[], 而现在String底层变更为byte[],以此使得内存的利用率更加高效。

增强的StreamAPI

takeWhile方法

takeWhile()的用法和filter()的用法一致,但结果有所不同,filter是遍历流中所有元素,并舍弃所有不符合条件的元素。而takewhile()则是从开始进行遍历,如果出现不符合条件的元素时,就舍弃并中断流。也就是说,当流中出现不符合条件的元素时,即使后面的元素符合条件也依然会被舍弃。有点像&&&的意思,举个例子:

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .filter(i -> i < 4 )
.forEach(System.out::print);
// 打印结果为:123321
Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .takeWhile(i -> i < 4 )
.forEach(System.out::print);
// 打印结果为:123

dropWhile方法

dropWhile()正好与takeWhile()相反,前者将得到从头开始的元素,而后者返回剩余的元素,但需要注意的一点是,千万不要认为他是反向遍历,因为它得到的结果是正序的。而反向遍历的结果是反序的。这个细节不注意的话,可能会影响实际生产冲的业务。

ofNullable方法

这个方法允许初始化一个空的流

Stream.ofNullable(null).count() 
// 结果为0

增强的iterate方法

Iterate方法现在可以传入三个表达式,依此来实现复杂的迭代。

Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);

Records(类)

Records是一种特殊的类,用于快速构建java实体

public record Person(String name ,Integer age) {
    
}

类似于以下代码:

@Data
public class Person{
    
     private String name;
     private Integer age;
}

var关键字

现在Java的局部变量可以使用var关键字,可以进行变量类型推断,就像javascript一样。

var a = “ABC”;
System.out.println(a.getClass())

新的HttpClient

参考以下类,使用很简单,可以阅读java.net.http中的相关API
java.net.http.HttpClient
java.net.http.HttpRequest
java.net.http.HttpResponse

快速构建集合

参考以下代码,同时List集合可以通过重载的toArray方法方便的转换为数组

List.of(“a”, “b”, “c”);
Map.of(“ak”, “av”, “bk”, “bv”);

通过Files类快速读写

Files.writeString(
    Path.of("./", "tmp.txt"), // 路径
    "hello, jdk11 files api", // 内容
    StandardCharsets.UTF_8); // 编码
String s = Files.readString(
    Paths.get("./tmp.txt"), // 路径
StandardCharsets.UTF_8); // 编码

增强的String

strip等系列方法

相对于trim, strip可以去掉unicode空格, 同时还有stripLeading()stripTrailing()方法用于分别取出首空和尾空。因此不再建议使用trim,而是strip

isBlank方法和isEmpty

前者忽略空格,后者只要有长度就判为非空。通常对于形参校验的情况下,应使用isBlank

lines方法

lines()方法会将一个多行字符串拆分为多个单行字符串,可以方便的以“行“来遍历多行字符串。

repeat方法

该方法可以构建一个由多个相同字符串组合的字符串。很绕口,代码解释如下:

String str = “hello!.repeat(2);
// 其中,str被赋值为 “hello!hello!”

文本块支持

通过三个"可以直接编写一个文本块,而不需要繁琐的代码构建。这对于写SQL或一切其他动态脚本时非常实用。随着IDE不断进步,未来会更美好。

String str = 
"""
public static void main(String[] args){
	System.out.println("hello world!")
}
"""

等同于:

String str = 
"public static void main(String[] args){\n" + 
"	System.out.println(\"hello world!\")\n" + 
"}"

增强的switch表达式

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

NumberFormat增加了压缩数字的支持

String number = NumberFormat.getCompactNumberInstance(Locale.US, 
		NumberFormat.Style.SHORT).format(1000);
// 其中number = “1k“

增强的instanceof

if (obj instanceof String str) {
    
    System.out.println("str length:" + str.length());
} else {
    
    System.out.println("obj not string.");
}

码农福音,增强的NullPointerExceptions

增强后的NullPointerExceptions可以将具体引发空指针的变量名称和位置披露出来,对于新手来说,可以更方便问题排查。

允许方位外部存储器

没有想到会有什么作用,感觉这很不安全,在我的印象中,只有开发游戏外挂或者开发一些破解器才会用到这些。不重点介绍,有兴趣的可以直接查阅相关文档。

密封类

通过sealedpermits关键字可以创建一个密封类,这个密封类只允许特定的类对其进行扩展和实现

// 创建一个密封的Hello接口,只允许Hello2类对其进行实现
public interface sealed class Hello permits Hello2{
    }

同时,也可以通过在子类或实现类添加non-sealed关键字来进行解封。

支持Unix套接字

通过java.net.UnixDomainSocketAddress可以连接unix套接字,以此来实现更安全的内部通信。

直接打包成可执行程序

支持将Java程序打包为对应平台的可执行程序
linux: deb和rpm
mac: pkg和dmg
Windows: msi和exe

假如我们在lib目录下有一个jar包组成的应用,并且main.jar包含main方法,则可以使用下面的语句产生对应平台的可执行程序
jpackage --name myapp --input lib --main-jar main.jar

如果main.jar的MANIFEST.MF没有指定main函数,则需要在命令行中指定
jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main

Clinker

通过Clinker可以更方便的执行某个原生C函数,具体参考相关文档。

macOS/AArch64 端口

将 JDK 移植到新架构 macOS/AArch64 期待未来需求

新的 macOS 渲染管线

需要使用新的 Apple Metal 框架为 macOS 提供新的 Java 2D 渲染管道。与今天一样,Java 2D 完全依赖于 OpenGL。虽然 Apple 在 macOS 10.14 中弃用了 OpenGL 渲染库,但 Metal 框架取代了 OpenGL 渲染库。

反射相关

java.lang.Class中新增了两个方法

boolean isSealed()
Class<?>[] getPermittedSubclasses()
前者用于判断该类是否为密封类,后者则用来获得当前密封类所允许扩展的Class列表。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guoshengkai373/article/details/122984333

智能推荐

如何利用 onlyoffice 实现文档格式转换_onlyoffice转换pdf-程序员宅基地

文章浏览阅读744次。日常生活和工作中,文档格式转换应该是很常见的需求。面对这样的需求,我们技术男有没有属于自己的好方法呢?答案是有的,它就是 onlyoffice,今天就来介绍如何利用 onlyoffice 实现文档格式转换。官方的 onlyoffice 版本在 4.2 之前使用的请求是 Get 类型,之后的版本使用的请求类型是 Post,这一点需要我们特别注意。下面的表格是关于格式转换 API 参数的详细介绍。属性参数描述数据类型存在类型Async定义转换请求类型:异步与否。支持的值:truefalse。_onlyoffice转换pdf

JavaScript Math.PI 属性-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏16次。什么是PI?PI就是圆周率π,PI是弧度制的π,也就是180°所以,Math.PI = 3.14 = 180°ps,PI是一个浮小数Math.PI/5*4分别是什么意思?let dig = Math.PI/5*4Math.PI/5,表示角度平分为36° 每个顶点到与中心连线之间的夹角α=(2π)/n = Math.PI / n * 2 那么相间的两个顶点到与中心连线之间的夹..._math.pi

Windows下,使用免安装ZIP归档,安装MySQL(5.5)服务器-程序员宅基地

文章浏览阅读1.1k次。1. 解压 MySQL ZIP压缩包 到 安装路径 D:\xapp\apps\,并将解压出来的文件夹重命名为 mysql。2.将MySQL的可执行文件目录 D:\xapp\apps\mysql\bin 加入系统环境变量,然后重启计算机。6.启动Windows命令行 键入 mysql -u root -p ,然后两次回车,进入MySQL控制台。如果通过配置文件 将 数据库目录设置到了别处,则需要将 mysql程序根目录的 data目录中。的内容拷贝到新的目录中,否则MySQL无法启动。

Bootstrap4总结(1)_bootstrap4的好处-程序员宅基地

文章浏览阅读1k次。一.Bootstrap简介1.什么是BootstrapBootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局、移动设备优先的 WEB 项目。Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML、CSS 和 JS 开发的开源工具集。2.Bootstrap的来源Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架,使得 W._bootstrap4的好处

[C++]LeetCode208 . 实现 Trie (前缀树)-程序员宅基地

文章浏览阅读264次。208 . 实现 Trie (前缀树)题目:实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app”); // 返回 truetrie.insert(“app”);tr

阶乘和(高精度算法)_阶乘和高精度-程序员宅基地

文章浏览阅读6.6k次,点赞6次,收藏12次。(对于自然数N的阶乘,当N比较小时,可以32位整数int范围内准确表示 。例如12!=479001600<2147483647(231-1) 而20!=2432902008176640000<9223372036854775807(263-1)可以在64位整数long long int范围内准确表示 ,但是N取值更大时,N!只能使用浮点数计算,从而产生误差 )题目描述已知正整数N(N..._阶乘和高精度

随便推点

java file数组 初始化_Java数组的定义,声明,初始化和遍历-程序员宅基地

文章浏览阅读633次。数组的定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点:1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。2. 其元素必须是相同类型,不允许出现混合类型。3. 数组类型可以是任何数据类型,包括基本类型和引用类型。数组变量属引用类型,数组也可以看..._java file 数组

十四章上机1_北大青鸟java第十四章上机练习4-程序员宅基地

文章浏览阅读449次。实现客户姓名录入 package kj;public class kehu { String []names=new String[10]; public void addName(String name){ for(int i=0;i

React路由 报错 ‘Switch‘ is not exported from ‘react-router‘.-程序员宅基地

文章浏览阅读722次。配置 路由 报错 'Switch' is not exported from 'react-router'.npm uninstall react-router-domnpm install [email protected]

利用tushare实现选股_tushare 选股-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏7次。ID:399899量化交易中,首先要弄好的就是选股。然后在才是买卖策略的制定。不同类型的策略,选股思路也不相同。俗话说得好,不管黑猫白猫,抓到老鼠的就是好猫。一个好的选股策略,往往在量化中是起较为关键的作用的。要实现程序化选股的话,数据又是一个前提。要有数据才能去实现编写程序。数据来源有很多,可以去爬取,也可以去股票交易网站下载。当然也有一些接口可以提供数据。常见的接口有tushare、baostock、akshare在这里我以一个简单的选股案例,为大家介绍一下使用tushare接口使用tush_tushare 选股

Gin框架使用Casbin进行用户权限校验_gin 的权限校验-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏10次。以下是测试项目目录一、配置modelconf/casbin_rbac_model.conf# 请求[request_definition]r = sub,obj,act# sub ——> 想要访问资源的用户角色(Subject)——请求实体# obj ——> 访问的资源(Object)# act ——> 访问的方法(Action: get、post...)# 策略(.csv文件p的格式,定义的每一行为policy rule;p,p2为policy rule的名字。)_gin 的权限校验

OKR制定与实施:团队OKR众筹策略_运营okr的制定与实施-程序员宅基地

文章浏览阅读319次。例如,一个团队有20个人,其中有2个员工在共同做A业务,3个员工在共同做B业务,5个员工在共同做C业务,剩下10个员工在共同做D业务,那么可以基于业务相关性将这20个员工分成A业务研讨组、B业务研讨组、C业务研讨组和D业务研讨组,这样,在步骤2目标众筹时,就以A、B、C、D 4个研讨小组为单位,邀请其输出3~5个团队OKR,然后团队主管再基于所有小组贡献的团队OKR进行投票表决,形成团队的OKR。通过这种方式,大大增强了团队成员对团队目标的共识程度,团队目标真正变成了大家共同的目标,而不再只是主管的目标。_运营okr的制定与实施

推荐文章

热门文章

相关标签