🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 流异常(Stream Exception) 通过修改**CompletableExceptions.java**,看看 **CompletableFuture**异常与流异常有何不同: ```java // concurrent/StreamExceptions.java import java.util.concurrent.*; import java.util.stream.*; public class StreamExceptions { static Stream<Breakable> test(String id, int failcount) { return Stream.of(new Breakable(id, failcount)) .map(Breakable::work) .map(Breakable::work) .map(Breakable::work) .map(Breakable::work); } public static void main(String[] args) { // No operations are even applied ... test("A", 1); test("B", 2); Stream<Breakable> c = test("C", 3); test("D", 4); test("E", 5); // ... until there's a terminal operation: System.out.println("Entering try"); try { c.forEach(System.out::println); // [1] } catch (Exception e) { System.out.println(e.getMessage()); } } } ``` 输出结果: ``` Entering try Breakable_C [2] Breakable_C [1] Throwing Exception for C Breakable_C failed ``` 使用 `CompletableFuture`,我们可以看到测试A到E的进展,但是使用流,在你应用一个终端操作之前(e.g. `forEach()`),什么都不会暴露给 Client `CompletableFuture` 执行工作并捕获任何异常供以后检索。比较这两者并不容易,因为 `Stream` 在没有终端操作的情况下根本不做任何事情——但是流绝对不会存储它的异常。