20

最通俗易懂的 Java 11 新特性讲解

 4 years ago
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.

Oxz5l3JUFaHrCNm.jpg

大多数开发者还是沉浸在 Java 8 中,而 Java 14 将要在 2020 年 3 月 17 日发布了,而我还在写着 Java 11 的新特性。 Java 11Java 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 类带来了一系列的好用操作。

  1. isBlank() 判空。

    // 判空,blank里我放入了全角空格,半角空格,TAB
    String blank = "    ";
    System.out.println(blank.isBlank());
    
    // 输出
    // true
    
  2. lines() 分割获取字符串流。

    // lines 返回一个 Stream
    String line = "a\nb\nc";
    Stream<String> lines = line.lines();
    // 使用 lambda 遍历
    lines.forEach(System.out::println);
    
    // 输出
    // a
    // b
    // c
    
  3. repeat() 复制字符串

    // 复制字符串
    String repeat = "我的微信:wn8398,";
    String repeat3 = repeat.repeat(3);
    System.out.println(repeat3);
    
    // 输出
    // 我的微信:wn8398,我的微信:wn8398,我的微信:wn8398,
    
  4. 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 和其他变量类型混用。

Lgjh2n6qAr34lK8.png

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 中将开源免费。所有人都可以使用这个功能了。

其他更新

  1. JEP 309 - 添加动态文件常量。
  2. JEP 318 - 添加 Epsilon 垃圾收集器。
  3. 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)。
  4. JEP 329 - 增加加密算法 chacha20,poly1305 的实现。
  5. JEP 333 - 引入实验性的 ZGC 垃圾收集器,保证停摆时间不会超过 10ms。
  6. JEP 335 - 废弃 Nashorn JavaScript 引擎

文章案例都已经上传到 Github: niumoo/jdk-feature


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK