只记录未来开发时可能用到的特性。 都2023年了,真正可能用的版本只有11和17,不关心特性到底在哪个中间版本脱离 preview 了。
#Java9
https://www.baeldung.com/new-java-9
-
新的 HTTP client
HttpClient
HttpRequest
HttpResponse
builder 构造 HTTP 请求 -
Try-With-Resources 能 close 掉在 try 之前定义的 auto-closable 资源, 只要资源是 final or effectively final。 Effectively final means that the variable can’t be changed once it has been initialized. 不显式地加 final 也行,IDE 会提示的。
-
Interface Private Method 帮助分解复杂的 default 方法。
-
JShell is read–eval–print loop – REPL for short.不需要定义 Main 来测试代码片段了。
jshell> /save c:\develop\JShell_hello_world.txt
jshell> /open c:\develop\JShell_hello_world.txt
Hello JShell!
- 用 jcmd 在不重启 JVM 的情况下修改 JVM 参数。
#Java10
https://www.baeldung.com/java-10-overview
- Var var is not a keyword – this ensures backward compatibility for programs using var say, as a function or variable name. var is a reserved type name. 意思是,仍然能用 var 作为变量名,因为它不在 Java 的词法里,是语法分析阶段判断的。 https://stackoverflow.com/questions/49102553/what-is-the-conceptual-difference-between-a-restricted-keyword-and-reserved-t 使用是有限制的: is available only for local variables (with the initializer). 其实有些不 new 的情况也能用,比如返回值,但不推荐,减少可读性。 From https://www.baeldung.com/java-10-local-variable-type-inference
** [List|Set|Map]copyOf() 是浅拷贝,里面是 DTO 的话不会调用 DTO 的 clone,不要用。
#Java11(Oracle JDK 转商用)(201809)
https://www.baeldung.com/java-11-new-features
-
Collection 转 array String[] sampleArray = sampleList.toArray(String[]::new);
-
Local-Variable Syntax for Lambda 用这个语法给 lambda 变量加注解
|
|
- nestmate 概念(不需要记) https://www.baeldung.com/java-nest-based-access-control 对程序员来说,有新的 Reflection API。 外部类和内部类互为 nestmate:外部类同时为外部类和内部类的 NestHost, 外部类和内部类互相加为 NestMembers.这样 JVM 能省点事。 nestmate 互相能在编码时读 private 成员,像以前一样。 以前用 Reflect API 不能读,现在能了。
|
|
#Java12(201903)
https://www.baeldung.com/java-12-new-features
- String.transform() ,接受一个 Function 应用到字符串上,返回另一个字符串。
|
|
- Teeing Collector in Stream API, 接受两个 Collector 和一个 merge 函数,合并两 Collector 结果。
|
|
- instanceof 后定义变量名
|
|
#Java13(201909)
https://www.baeldung.com/java-13-new-features
没有 release 出的值得注意的
#Java14(202003)
https://www.baeldung.com/java-14-new-features
- Switch 语法函数式更新 执行可不返回值。若使用函数体{}且要返回值,要用
yield
而非return
。
|
|
- Text Block 多行字符串 不需要转义双引号!所有 String 方法都支持。但有两个其他的转义:
\
to indicate the end of the line, so that a new line character is not introduced\s
to indicate a single space
|
|
- Records https://www.baeldung.com/java-record-keyword 全参数构造方法 override 有些奇怪,加上全参数会报错。 因为字段全是 final 所以不会有 Setter 方法,只生成 Getter。 适合定义只读的结构复杂些的常量。
|
|
- 更好的 NPE 位置报错
#Java15(202009)
https://www.baeldung.com/java-15-new
- Sealed Classes
两个新关键字:
sealed
,permits
控制父类拥有有限的子类。 子类需声明为sealed
,final
,non-sealed
。non-sealed
是给扩展留的口子。
|
|
- Foreign Memory API 在 JVM Heap 之外操作 JVM 内存,不会被 GC,所以可以处理大段的内存。
#Java16(202103)
https://www.baeldung.com/java-16-new-features
-
能用反射 API 调用接口的 default 方法了
-
Stream.collect(Collectors.toList()); 简化成 Stream.toList(),还有 toSet()。
#Java17(202109)
https://www.baeldung.com/java-17-new-features
-
应用可指定 JVM 中预定义的反序列化前 Filter 的算法 https://openjdk.org/jeps/290 https://openjdk.org/jeps/415
-
LTS 间隔缩短到两年,让202309发布的 Java21成为下一个 LTS
Java17那个 preview 的 switch pattern matching 真香,能省掉不少 if-else-大括号,可惜在 preview。