![](/style/images/good.png)
![](/style/images/bad.png)
最通俗易懂的 Java 11 新特性讲解
source link: https://www.codingme.net/2020/03/jdk/jdk11-feature/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
大多数开发者还是沉浸在 Java 8
中,而 Java 14
将要在 2020 年 3 月 17 日发布了,而我还在写着 Java 11
的新特性。 Java 11
是 Java 8
之后的第一个 LTS 版本,但是也自从 Java 11
开始, Oracle JDK 不再可以免费的用于商业用途,当然如果你是个人使用,或者是使用 Open JDK ,那么还是可以免费使用的。
有些人很关心 Java 11
是否收费,Oracle 表示除非你在生产中使用,否则可以不用收费。
即使收费,免费的 Open JDK 不也很香吗。
可免费用于生产环境的 Open JDK 官网: https://jdk.java.net/11/
再 6 个月后, Java 15
都要来了,这种发布节奏不仅让人有点应接不暇,更有点眼花缭乱。但是不管怎么说,发展的趋势不可逆,所以补习一波 Java 11
也是很有必要的。
1. String API
字符串绝对是 Java 中最常用的一个类了,String 类的方法使用率也都非常的高,在 Java 11
中又为 String 类带来了一系列的好用操作。
-
isBlank() 判空。
// 判空,blank里我放入了全角空格,半角空格,TAB String blank = " "; System.out.println(blank.isBlank()); // 输出 // true
-
lines() 分割获取字符串流。
// lines 返回一个 Stream String line = "a\nb\nc"; Stream<String> lines = line.lines(); // 使用 lambda 遍历 lines.forEach(System.out::println); // 输出 // a // b // c
-
repeat() 复制字符串
// 复制字符串 String repeat = "我的微信:wn8398,"; String repeat3 = repeat.repeat(3); System.out.println(repeat3); // 输出 // 我的微信:wn8398,我的微信:wn8398,我的微信:wn8398,
-
strip() 去除前后空白字符。
// 去除前后空白 String strip = " https://www.wdbyte.com "; System.out.println("==" + strip.trim() + "=="); // 去除前后空白字符,如全角空格,TAB System.out.println("==" + strip.strip() + "=="); // 去前面空白字符,如全角空格,TAB System.out.println("==" + strip.stripLeading() + "=="); // 去后面空白字符,如全角空格,TAB System.out.println("==" + strip.stripTrailing() + "=="); // 输出 // == https://www.wdbyte.com == // ==https://www.wdbyte.com== // ==https://www.wdbyte.com == // == https://www.wdbyte.com==
这里注意,
trim
只能去除半角空格,而strip
是 去除各种空白符 。
2. File API
读写文件变得更加方便。
// 创建临时文件 Path path = Files.writeString(Files.createTempFile("test", ".txt"), "https://www.wdbyte.com"); System.out.println(path); // 读取文件 // String ss = Files.readString(Path.of("file.json")); String s = Files.readString(path); System.out.println(s); // 结果 // https://www.wdbyte.com
3. JEP 321 - HTTP Client
在 Java 11
中 Http Client API 得到了标准化的支持。且支持 HTTP/1.1 和 HTTP/2 ,也支持 websockets。
你可以像这样发起一个请求。
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.hao123.com")) .build(); // 异步 client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); // 同步 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
更多的如同步异步请求,并发访问,设置代理等方式,可以参考 OpenJDK 官方文档。
http://openjdk.java.net/groups/net/httpclient/recipes-incubating.html
你现在还需要各种 HTTP Client 依赖包吗?
4. JEP 323 - Lambda 局部变量推断
在 Java 10
中引入了 var
语法,可以自动推断变量类型。在 Java 11
中这个语法糖可以在 Lambda 表达式中使用了。
var hashMap = new HashMap<String, Object>(); hashMap.put("wechat", "wn8398"); hashMap.put("website", "https://www.wdbyte.com"); hashMap.forEach((var k, var v) -> { System.out.println(k + ": " + v); });
这里需要注意的是, (var k,var v)
中,k 和 v 的类型要么都用 var ,要么都不写,要么都写正确的变量类型。而不能 var 和其他变量类型混用。
5. JEP 330 - 单命令运行 Java
自从学习 Java 的第一天,我们就知道运行一个 Java 文件,要先用 javac
命令编译,再用 java
命令运行,而现在只要一个 java
命令就可以运行了。
$ cat Main.java public class Main { public static void main(String[] args) { System.out.println("wechat:wn8398"); } } $ java Main.java wechat:wn8398
6. 免费的飞行记录器
商业版 JDK 中一直有一款地开销的事件信息收集工具,也就是飞行记录器(Java Flight Recorder),它可以对 JVM 进行检查、分析、记录等。当出现未知异常时可以通过记录进行故障分析。这个好用的工具在 Java 11
中将开源免费。所有人都可以使用这个功能了。
其他更新
- JEP 309 - 添加动态文件常量。
- JEP 318 - 添加 Epsilon 垃圾收集器。
- JEP 320 - 删除 Java EE 和 corba 模块(java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind)。
- JEP 329 - 增加加密算法 chacha20,poly1305 的实现。
- JEP 333 - 引入实验性的 ZGC 垃圾收集器,保证停摆时间不会超过 10ms。
- JEP 335 - 废弃 Nashorn JavaScript 引擎
文章案例都已经上传到 Github: niumoo/jdk-feature
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK