Java 8 和 Java 11 的功能区别
以下是这两个版本之间的一些详细区别:
Java 8 的主要特性
-
Lambda 表达式
- Lambda 表达式是一种轻量级的匿名函数,可以作为方法参数传递或存储在变量中。
- Lambda 表达式极大地简化了函数式编程风格的代码编写,使得代码更加简洁易读。
-
Stream API
- Stream API 提供了一种高效、易于使用的处理集合的方法,特别是与 Lambda 表达式结合使用时。
- Stream API 支持并行处理,使得多核处理器上的数据处理更为高效。
-
默认方法和静态方法
- 接口中可以包含默认方法(default methods)和静态方法(static methods),这使得接口可以提供默认实现,从而减少了实现类的工作量。
- 默认方法允许在不影响现有实现的情况下向接口添加新方法。
-
日期/时间 API
- 引入了一个新的日期/时间API (
java.time
包),替代了旧的java.util.Date
和java.util.Calendar
类。 - 新的日期/时间API提供了更强大且线程安全的日期和时间处理类。
- 引入了一个新的日期/时间API (
-
Optional 类
Optional
类是一个可以为null的容器对象,旨在避免空指针异常。- 使用
Optional
可以更优雅地处理可能为null的对象引用。
-
重复注解
- 允许在一个声明上使用同一个注解多次。
-
类型推断
- Lambda 表达式中局部变量的类型可以从上下文中推断出来。
-
Nashorn JavaScript 引擎
- Nashorn 是一个高性能的JavaScript引擎,集成在Java 8中,用于执行简单的脚本任务。
-
并发改进
CompletableFuture
类提供了对异步计算的支持。CompletableFuture
是 Java 8 中引入的一个非常强大的工具,它用来处理异步计算的结果,并且可以链式地组合多个异步操作。下面我将详细介绍如何使用CompletableFuture
来完成一些基本的任务,包括创建、组合以及处理异常。
创建 CompletableFuture
1. 直接创建
CompletableFuture<String> future = new CompletableFuture<>();
2. 通过工厂方法
// 没有结果
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
// 去异步执行的任务
});
// 有结果
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
// 去异步执行的任务
return "Hello World!";
});
处理结果
1. thenApply
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World!");
2. thenAccept
CompletableFuture.supplyAsync(() -> "Hello")
.thenAccept(s -> System.out.println(s + " World!"));
3. thenRun
CompletableFuture.supplyAsync(() -> "Hello")
.thenRun(() -> System.out.println("World!"));
组合多个 CompletableFuture
1. thenCompose
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello")
.thenCompose(s -> CompletableFuture.supplyAsync(() -> s + " World!"));
2. thenCombine
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> "Hello")
.thenCombine(CompletableFuture.supplyAsync(() -> " World!"), (s1, s2) -> s1 + s2);
3. allOf
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> " World!");
CompletableFuture.allOf(cf1, cf2).join(); // 等待所有 CompletableFuture 完成
System.out.println(cf1.join() + cf2.join());
4. anyOf
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> " World!");
CompletableFuture<Object> result = CompletableFuture.anyOf(cf1, cf2);
System.out.println(result.join()); // 输出第一个完成的 CompletableFuture 的结果
处理异常
1. handle
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Oops!");
})
.handle((result, ex) -> {
if (ex != null) {
System.err.println(ex.getMessage());
return "Error occurred!";
} else {
return result;
}
});
2. exceptionally
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Oops!");
})
.exceptionally(ex -> {
System.err.println(ex.getMessage());
return "Error occurred!";
});
完整示例
下面是一个完整的示例,展示了如何使用 CompletableFuture
来执行异步任务,并处理结果和异常:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = future1.thenApply(s -> s + " World!")
.exceptionally(ex -> {
System.err.println("An exception occurred: " + ex.getMessage());
return "Error occurred!";
});
String result = future2.get();
System.out.println("Result: " + result);
}
}
在这个示例中,首先创建了一个 CompletableFuture
,然后使用 thenApply
方法来添加一个后续操作。如果在执行过程中发生异常,exceptionally
方法会捕获该异常并返回一个错误消息。
- 其他改进
- 包括类型注解、新的方法引用语法、更新的类文件格式等。
Java 11 主要特性
-
性能改进
- Java 11 对JVM进行了优化,提高了性能。
- 默认垃圾回收器由 Parallel GC 改为 G1 GC,后者在减少暂停时间和提高响应性方面表现更好。
-
新特性
- 模块化:Java 11 继续完善了 Java 平台模块系统 (JPMS),使得模块化应用程序变得更加容易管理和部署。
- 动态类文件常量:允许运行时生成类文件常量,提供更大的灵活性和扩展性。
- 局部变量类型推断:通过
var
关键字支持局部变量类型推断,使得代码更加简洁。
-
新的 HTTP 客户端 API
- 提供了一个新的非阻塞HTTP客户端API (
java.net.http
包),取代了旧的HttpURLConnection
。
- 提供了一个新的非阻塞HTTP客户端API (
-
移除功能
- 移除了JavaFX、JDBC-ODBC桥接、Corba模块等过时的技术。
- 移除了Javadoc中的HTML标签支持。
-
其他改进
- 垃圾收集器:引入了 ZGC(Z Garbage Collector),这是一个低延迟的垃圾回收器。
- 文件系统 SPI:增强了文件系统的可扩展性。
- 安全性增强:包括TLS 1.3支持等。
- Unicode 11:支持最新的Unicode版本。
主要差别:
- 语言级别:Java 11 引入了
var
关键字用于局部变量类型推断,使得代码更加简洁。 - 性能:Java 11 在性能方面进行了优化,尤其是在垃圾回收方面。
- 库支持:Java 11 添加了新的HTTP客户端API等库支持,同时也移除了旧的过时组件。
- 模块化:Java 11 继续改进了模块化支持,帮助构建更稳定可靠的模块化应用程序。
- 安全性:Java 11 增强了安全性,包括对最新协议的支持等。
这些特性使得Java 11 成为了一个更加强大、安全、高效的版本,适合开发现代应用程序。