提交 d58bc898 编写于 作者: W wizardforcel

2021-10-01 23:08:30

上级 169b8762
......@@ -10,7 +10,7 @@
* 一种新的堆栈遍历 API,用于以编程方式分析堆栈跟踪,以便应用自动更正
* 创建紧凑的、不可修改的集合实例的新的方便的静态工厂方法
* 新的`CompletableFuture`类作为访问异步处理结果的方式
* JDK 9 stream API 的改进可以加快处理速度,同时提高代码的可读性
* JDK 9 API 的改进可以加快处理速度,同时提高代码的可读性
# 过滤流
......@@ -699,7 +699,7 @@ Set<String> immutableSet =
.asList("Life", "is", "good!")));
```
或者,如果 streams 是您的朋友,您可以编写以下内容:
或者,如果是您的朋友,您可以编写以下内容:
```java
Set<String> immutableSet = Stream.of("Life","is","good!")
......@@ -881,7 +881,7 @@ System.out.println("\n");
![Why New Factory Methods?](img/05_29.jpg)
如果您没有在 Java9 中使用过集合,您可能会惊讶地看到输出中集合元素的顺序异常混乱。事实上,这是 JDK9 中引入的 set 和 maps 的另一个新特性。在过去,`Set``Map`实现不能保证保持元素的顺序。但通常情况下,顺序被保留下来,一些程序员编写了依赖于它的代码,从而在应用程序中引入了令人烦恼的不一致且不容易复制的缺陷。新的`Set``Map`实现更频繁地改变顺序,如果不是在每次新的代码运行时。这样,它在开发的早期就暴露了潜在的缺陷,并减少了其进入生产的机会。
如果您没有在 Java9 中使用过集合,您可能会惊讶地看到输出中集合元素的顺序异常混乱。事实上,这是 JDK9 中引入的集合和映射的另一个新特性。在过去,`Set``Map`实现不能保证保持元素的顺序。但通常情况下,顺序被保留下来,一些程序员编写了依赖于它的代码,从而在应用程序中引入了令人烦恼的不一致且不容易复制的缺陷。新的`Set``Map`实现更频繁地改变顺序,如果不是在每次新的代码运行时。这样,它在开发的早期就暴露了潜在的缺陷,并减少了其进入生产的机会。
与列表类似,即使不使用 Java9 新的不可变集工厂,我们也可以创建不可变集。一种方法如下:
......@@ -1034,7 +1034,7 @@ List<String> immutableList =
immutableList.stream().forEach(System.out::print);
```
从前面的代码注释中可以看到,新的 factory 方法不允许将`null`包含为列表值。
从前面的代码注释中可以看到,新的工厂方法不允许将`null`包含为列表值。
`immutableSet`创建看起来与此类似:
......@@ -1074,7 +1074,7 @@ immutableMap3.values().stream().forEach(System.out::print);
System.out.println("\n");
```
如果我们运行前面所有使用新 factory 方法的示例,则输出如下:
如果我们运行前面所有使用新工厂方法的示例,则输出如下:
![The New Factory Methods in Action](img/05_33.jpg)
......@@ -1150,10 +1150,10 @@ thenApply(Function<T,U> fn)
thenAccept(Consumer<T> action)
```
它们都返回`CompletableFuture`,携带函数或 void 的结果(在`Runnable``Consumer`的情况下)。它们中的每一个都有两个异步执行相同函数的伴随方法。例如,让我们以`thenRun(Runnable action)`方法为例。以下是它的同伴:
它们都返回`CompletableFuture`,携带函数或`void`的结果(在`Runnable``Consumer`的情况下)。它们中的每一个都有两个异步执行相同函数的伴随方法。例如,让我们以`thenRun(Runnable action)`方法为例。以下是它的同伴:
* `thenRunAsync(Runnable action)`方法,在默认`ForkJoinPool.commonPool()`池的另一个线程中运行该操作
* `thenRun(Runnable action, Executor executor)`方法,它在作为参数 executor 传入的池中的另一个线程中运行操作
* `thenRun(Runnable action, Executor executor)`方法,它在作为参数`executor`传入的池中的另一个线程中运行操作
至此,我们已经介绍了`CompletionStage`接口的九种方法。
......@@ -1180,7 +1180,7 @@ whenComplete(BiConsumer<T,Throwable> action)
稍后我们将看到这些方法的使用示例。当链中的某个方法引发异常时,将跳过链中其他所有方法,直到遇到第一个`handle()`方法或`whenComplete()`为止。如果链中没有这两个方法,那么异常将像任何其他 Java 异常一样冒泡。这两种方法也有异步伙伴,这意味着我们已经讨论了 36 种(38 种)方法的`CompletionStage`接口。
还有一种方法只处理异常(类似于传统编程中的 catch 块):
还有一种方法只处理异常(类似于传统编程中的`catch`块):
```java
exceptionally(Function<Throwable,T> fn)
......@@ -1694,7 +1694,7 @@ String result =
System.out.println("Iterate: " + result);
```
请注意,stream 元素的类型不需要是整数。它可以是源代码生成的任何类型。因此,新的`iterate()`方法可用于提供终止任何类型数据流的标准。
请注意,元素的类型不需要是整数。它可以是源代码生成的任何类型。因此,新的`iterate()`方法可用于提供终止任何类型数据流的标准。
# 总结
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册