首页 JDK11 新特性
文章
取消

JDK11 新特性

String API

新增一些方法:isBlanklinesstripstripLeadingstripTrailingrepeat。让我们看看如何利用新方法来从多行字符串中提取非空白行:

1
2
3
4
5
6
String multilineString = "Baeldung helps \n \n developers \n explore Java.";
List<String> lines = multilineString.lines()
  .filter(line -> !line.isBlank())
  .map(String::strip)
  .collect(Collectors.toList());
assertThat(lines).containsExactly("Baeldung helps", "developers", "explore Java.");

File API

Files 类增加了 writeStringreadString 两个静态方法,可以直接把 String 写入文件,或者把整个文件读出为一个 String:

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

这两个方法可以大大简化读取配置文件之类的问题。

Collection 转 Array

java.util.Collection 接口包含一个新的默认转 Array 方法,该方法采用 IntFunction 参数。这使得从集合中创建正确类型的数组变得更加容易:

1
2
3
List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");

Not 断言

1
2
3
4
5
List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
List withoutBlanks = sampleList.stream()
  .filter(Predicate.not(String::isBlank))
  .collect(Collectors.toList());
assertThat(withoutBlanks).containsExactly("Java", "Kotlin");

Lambda 中的 LocalVar 语法

Java 11中添加了对在 lambda 参数中使用本地变量语法(var关键字)的支持。我们可以利用此功能将修饰符应用于我们的局部变量,例如定义类型注释:

1
2
3
4
5
List<String> sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
  .map((@Nonnull var x) -> x.toUpperCase())
  .collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");

Http Client

java.net.http 包的新 HTTP 客户端是在 Java 9 中引入的,它现已成为 Java 11 的标准功能。新的 HTTP API 提高了整体性能,并为 HTTP/1.1 和 HTTP/2 提供了支持:

1
2
3
4
5
6
7
8
9
10
HttpClient httpClient = HttpClient.newBuilder()
  .version(HttpClient.Version.HTTP_2)
  .connectTimeout(Duration.ofSeconds(20))
  .build();
HttpRequest httpRequest = HttpRequest.newBuilder()
  .GET()
  .uri(URI.create("http://localhost:" + port))
  .build();
HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
assertThat(httpResponse.body()).isEqualTo("Hello from the server!");

直接执行 Java 文件

1
2
$ java HelloWorld.java
Hello Java 11!

除了新增的API外,JDK11还带来了 EpsilonGC,就是什么也不做的 GC,以及 ZGC,一个几乎可以做到毫秒级暂停的GC。ZGC 还处于实验阶段,所以启动它需要命令行参数 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC。

JDK11是一个LTS版本(Long-Term-Support),所以放心升级吧!!!

本文由作者按照 CC BY 4.0 进行授权

JDK9 新特性

2022-12-21 内炼总结