JDK 9 重大特性全面解析
· 阅读需 4 分钟
Java 9 带来了许多重要的改进和新特性,让我们一起来了解这些变化。
1. 模块系统(Project Jigsaw)
模块系统是 Java 9 最重要的特性:
// module-info.java
module com.myapp {
requires java.base;
requires java.sql;
exports com.myapp.api;
provides com.myapp.spi.MyService with com.myapp.impl.MyServiceImpl;
}
主要特点:
- 更好的封装性
- 显式依赖声明
- 可配置的运行时映像
- 改进的性能和安全性
2. 集合工厂方法
引入了便捷的集合创建方法:
// 创建不可变集合
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("X", "Y", "Z");
Map<String, Integer> map = Map.of("one", 1, "two", 2);
// 创建更大的不可变 Map
Map<String, Integer> map = Map.ofEntries(
Map.entry("one", 1),
Map.entry("two", 2),
Map.entry("three", 3)
);
3. JShell REPL 工具
提供了交互式编程环境:
$ jshell
| Welcome to JShell -- Version 9
| For an introduction type: /help intro
jshell> int x = 10
x ==> 10
jshell> System.out.println("x = " + x)
x = 10
4. 接口私有方法
支持在接口中定义私有方法:
public interface MyInterface {
private String formatData(String data) {
return "[" + data + "]";
}
default void printData(String data) {
System.out.println(formatData(data));
}
}
5. Stream API 改进
新增了 Stream API 的便捷方法:
// takeWhile 和 dropWhile
Stream.of(1, 2, 3, 4, 5)
.takeWhile(n -> n < 4)
.forEach(System.out::println); // 输出 1, 2, 3
// iterate 方法支持 Predicate
Stream.iterate(1, n -> n < 100, n -> n * 2)
.forEach(System.out::println);
// ofNullable 方法
Stream.ofNullable(null).count(); // 0
6. HTTP/2 客户端
引入了新的 HTTP 客户端 API:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.header("Content-Type", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
7. 反应式流(Reactive Streams)
引入了反应式流 API:
// 发布者和订阅者示例
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
publisher.subscribe(new Flow.Subscriber<>() {
private Flow.Subscription subscription;
@Override
public void onSubscribe(Flow.Subscription subscription) {
this.subscription = subscription;
subscription.request(1);
}
@Override
public void onNext(String item) {
System.out.println("收到: " + item);
subscription.request(1);
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("完成");
}
});
8. 多版本 JAR 文件
支持在单个 JAR 文件中包含多个 Java 版本的类文件:
// 在 META-INF/versions/9 目录下的类文件
public class MyClass {
public void newMethod() {
// 使用 Java 9 特性的实现
}
}
// 在主目录下的类文件
public class MyClass {
public void newMethod() {
// 向后兼容的实现
}
}
9. 改进的 Javadoc
Javadoc 支持 HTML5 和搜索功能:
/**
* 这是一个示例类。
*
* @apiNote 这是一个 API 说明
* @implSpec 这是一个实现规范
* @implNote 这是一个实现说明
*/
public class Example {
// 类实现
}
总结
Java 9 带来了革命性的模块系统,以及众多改进开发体验的新特性。这些变化使得 Java 平台更加现代化,提供了更好的封装性、更简洁的语法和更强大的工具支持。建议开发者特别关注模块系统的使用,以及新的集合工厂方法和 Stream API 改进,这些特性可以显著提高开发效率。