Skip to content

Commit c371e99

Browse files
authored
Merge pull request lingcoder#216 from xiangflight/master
revision[14] Ranges of int
2 parents ef786cb + 29f5d0a commit c371e99

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

docs/book/14-Streams.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ public class ImperativeRandoms {
7373

7474
**注意**,你必须要研究程序的真正意图,而在 `Randoms.java` 中,代码只是告诉了你它正在做什么。这种语义清晰性也是 Java 8 的流式编程更受推崇的重要原因。
7575

76-
`ImperativeRandoms.java` 中显式地编写迭代机制称之为外部迭代。而在 `Randoms.java` 中,流式编程采用内部迭代。这种机制使得编写的代码可读性更强,也更能利用多核处理器的优势。通过放弃对迭代过程的控制,我们把控制权交给并行化机制。[并发编程](24-Concurrent-Programming.md)这一章了解这一点
76+
`ImperativeRandoms.java` 中显式地编写迭代机制称为外部迭代。而在 `Randoms.java` 中,流式编程采用内部迭代,这是流式编程的核心特性之一。这种机制使得编写的代码可读性更强,也更能利用多核处理器的优势。通过放弃对迭代过程的控制,我们把控制权交给并行化机制。我们将在[并发编程](24-Concurrent-Programming.md)一章中学习这部分内容
7777

7878
另一个重要方面,流是懒加载的。这代表着它只在绝对必要时才计算。你可以将流看作“延迟列表”。由于计算延迟,流使我们能够表示非常大(甚至无限)的序列,而不需要考虑内存问题。
7979

80-
8180
<!-- Java 8 Stream Support -->
81+
8282
## 流支持
8383

8484
Java 设计者面临着这样一个难题:现存的大量类库不仅为 Java 所用,同时也被应用在整个 Java 生态圈数百万行的代码中。如何将一个全新的流的概念融入到现有类库中呢?
@@ -94,7 +94,7 @@ Java 8 采用的解决方案是:在[接口](10-Interfaces.md)中添加被 `def
9494
<!-- Stream Creation -->
9595
## 流创建
9696

97-
你可以通过 `Stream.of()` 很容易地将一组元素转化成为流(`Bubble` 类在之前的章节中已经定义过了):
97+
你可以通过 `Stream.of()` 很容易地将一组元素转化成为流(`Bubble` 类在本章的后面定义):
9898

9999
```java
100100
// streams/StreamOf.java
@@ -164,11 +164,11 @@ e: 2.718
164164
pi: 3.14159
165165
```
166166

167-
在创建 `List<Bubble>` 对象之后,我们只需要简单地调用所有集合中都有的 `stream()`。中间操作 `map()` 会获取流中的所有元素,并且对流中元素应用操作从而产生新的元素,并将其传递到流中。通常 `map()` 会获取对象并产生新的对象,但是这里有特殊版本的方法用于数值类型的流。例如,`mapToInt()` 方法将一个对象流(objects stream)转换成为包含整形数字的 `IntStream`。同样,针对 `Float``Double` 也有类似名字的操作。
167+
在创建 `List<Bubble>` 对象之后,我们只需要简单地调用所有集合中都有的 `stream()`。中间操作 `map()` 会获取流中的所有元素,并且对流中元素应用操作从而产生新的元素,并将其传递到后续的流中。通常 `map()` 会获取对象并产生新的对象,但在这里产生了特殊的用于数值类型的流。例如,`mapToInt()` 方法将一个对象流(object stream)转换成为包含整型数字的 `IntStream`。同样,针对 `Float``Double` 也有类似名字的操作。
168168

169169
我们通过调用字符串的 `split()`(该方法会根据参数来拆分字符串)来获取元素用于定义变量 `w`。稍后你会知道 `split()` 参数可以是十分复杂,但在这里我们只是根据空格来分割字符串。
170170

171-
为了从 **Map** 集合中产生流数据,我们首先调用 `entrySet()` 去产生一个对象流,每个对象都包含一个 `key` 键以及与其相关联的 `value` 值。然后调用 `getKey()``getValue()` 将其分开
171+
为了从 **Map** 集合中产生流数据,我们首先调用 `entrySet()` 产生一个对象流,每个对象都包含一个 `key` 键以及与其相关联的 `value` 值。然后分别调用 `getKey()``getValue()` 获取值
172172

173173
### 随机数流
174174

@@ -265,7 +265,7 @@ public class RandomGenerators {
265265

266266
为了消除冗余代码,我创建了一个泛型方法 `show(Stream<T> stream)` (在讲解泛型之前就使用这个特性,确实有点作弊,但是回报是值得的)。类型参数 `T` 可以是任何类型,所以这个方法对 **Integer****Long****Double** 类型都生效。但是 **Random** 类只能生成基本类型 **int****long****double** 的流。幸运的是, `boxed()` 流操作将会自动地把基本类型包装成为对应的装箱类型,从而使得 `show()` 能够接受流。
267267

268-
我们可以使用 **Random** 为任意对象集合创建 **Supplier**如下是一个从文本文件提供字符串对象的例子
268+
我们可以使用 **Random** 为任意对象集合创建 **Supplier**如下是一个文本文件提供字符串对象的例子
269269

270270
Cheese.dat 文件内容:
271271

@@ -299,7 +299,7 @@ public class RandomWords implements Supplier<String> {
299299
}
300300
}
301301
public String get() {
302-
return words.get(rand.nextint(words.size()));
302+
return words.get(rand.nextInt(words.size()));
303303
}
304304
@Override
305305
public String toString() {
@@ -323,18 +323,18 @@ it shop sir the much cheese by conclusion district is
323323

324324
在这里你可以看到更为复杂的 `split()` 运用。在构造器中,每一行都被 `split()` 通过空格或者被方括号包裹的任意标点符号进行分割。在结束方括号后面的 `+` 代表 `+` 前面的东西可以出现一次或者多次。
325325

326-
我们注意到在构造函数中循环体使用命令式编程(外部迭代)。在以后的例子中,你会看到我们如何消除这一点。这种旧的形式虽不是特别糟糕,但使用流会让你的代码更好看一些
326+
我们注意到在构造函数中循环体使用命令式编程(外部迭代)。在以后的例子中,你甚至会看到我们如何消除这一点。这种旧的形式虽不是特别糟糕,但使用流会让人感觉更好
327327

328328
`toString()` 和主方法中你看到了 `collect()` 收集操作,它根据参数来组合所有流中的元素。
329329

330-
当你使用 **Collectors.**`joining()`,你将会得到一个 `String` 类型的结果,每个元素都根据 `joining()` 的参数来进行分割。还有许多不同的 `Collectors` 用于获取不同的结果
330+
当你使用 **Collectors.**`joining()`,你将会得到一个 `String` 类型的结果,每个元素都根据 `joining()` 的参数来进行分割。还有许多不同的 `Collectors` 用于产生不同的结果
331331

332-
在主方法中,我们看到了 **Stream.**`generate()` 的预览版本,它可以把任意 `Supplier<T>` 用于生成 `T` 类型的流。
332+
在主方法中,我们提前看到了 **Stream.**`generate()` 的用法,它可以把任意 `Supplier<T>` 用于生成 `T` 类型的流。
333333

334334

335335
### int 类型的范围
336336

337-
`IntStream` 类提供了 `range()` 方法用于生成整数序列的流。编写循环时,这个方法会更加便利:
337+
`IntStream` 类提供了 `range()` 方法用于生成整型序列的流。编写循环时,这个方法会更加便利:
338338

339339
```java
340340
// streams/Ranges.java

0 commit comments

Comments
 (0)