从Java8到Java17(四)

514 阅读2分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

上篇聊到Java9的模块化,Java9的主要更新也就讲完了。紧接着是10和11,这是两个匆忙的版本,没更新多少实质的内容,但因为这个阶段已经是半年一更新的节奏了,所以也没法放太多的东西,尤其是Java10,几乎没更新什么,但又好像变化挺大的。下面一起来看看。

var类型

首次出现在Java10中,也首次出现在Java中。开什么玩笑,Java一向是一个严谨的语言,怎么会允许若类型的var变量出现呢?没错,这就是现实,但var只能是局部变量,全局变量还是得乖乖标明类型。以我来看,var就应该普及,剩下的就交给编译器本身的类型推断。像kotlin,上来就是var和val,也没觉得突兀,也不影响它是个静态强类型语言。对于开发者来说,写一行代码能少敲好几次键盘。

Java10的更新就是这个。

全新的HTTP client API

这个api首次出现在9之中,当时并非一个稳定版本,在11中正式发布。原来jdk的http客户端真的难用,这也给了很多像okhttp、restTemplate和feign这样的第三方库极大的发挥空间,几乎是没人用原生的http客户端的。但现在不一样了,确实感觉是新时代的API了。

  1. 同步请求
HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_1_1)
        .followRedirects(Redirect.NORMAL)
        .connectTimeout(Duration.ofSeconds(20))
        .proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
        .authenticator(Authenticator.getDefault())
        .build();
   HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
   System.out.println(response.statusCode());
   System.out.println(response.body()); 
  1. 异步请求
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://foo.com/"))
        .timeout(Duration.ofMinutes(2))
        .header("Content-Type", "application/json")
        .POST(BodyPublishers.ofFile(Paths.get("file.json")))
        .build();
   client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println);

这是官方的demo,好用的不像jdk。

Lambda表达式中支持var变量

Java10支持了局部的var,11进一步让Lambda中也可以写var类型的局部变量,有了局部变量的命名之后也可以做一些事情,比如:

(@NonNull var x) -> process(x)

新的String方法

  • repeat:重复生成字符串
  • isBlank:不用在引入第三方库就可以实现字符串判空了
  • strip:去除字符串两边的空格,支持全角和半角,之前的trim只支持半角
  • lines:能根据一段字符串中的终止符提取出行为单位的流

ZGC

这在11中还是试验性的功能,一直到15发放出稳定版。据说性能很强。

以上就是Java10和11两个版本更新的内容。