mirror of
https://github.com/LingCoder/OnJava8.git
synced 2026-08-19 12:33:29 +08:00
校对 ISSUE #24 第13章函数式编程-新旧对比
This commit is contained in:
@@ -159,7 +159,7 @@
|
||||
* [for-in和迭代器](docs/book/12-Collections.md#for-in和迭代器)
|
||||
* [本章小结](docs/book/12-Collections.md#本章小结)
|
||||
* [第十三章 函数式编程](docs/book/13-Functional-Programming.md)
|
||||
* [旧vs新](docs/book/13-Functional-Programming.md#旧vs新)
|
||||
* [旧vs新](docs/book/13-Functional-Programming.md#新旧对比)
|
||||
* [Lambda表达式](docs/book/13-Functional-Programming.md#Lambda表达式)
|
||||
* [方法引用](docs/book/13-Functional-Programming.md#方法引用)
|
||||
* [函数式接口](docs/book/13-Functional-Programming.md#函数式接口)
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
* [for-in和迭代器](book/12-Collections.md#for-in和迭代器)
|
||||
* [本章小结](book/12-Collections.md#本章小结)
|
||||
* [第十三章 函数式编程](book/13-Functional-Programming.md)
|
||||
* [旧vs新](book/13-Functional-Programming.md#旧vs新)
|
||||
* [旧vs新](book/13-Functional-Programming.md#新旧对比)
|
||||
* [Lambda表达式](book/13-Functional-Programming.md#Lambda表达式)
|
||||
* [方法引用](book/13-Functional-Programming.md#方法引用)
|
||||
* [函数式接口](book/13-Functional-Programming.md#函数式接口)
|
||||
|
||||
@@ -33,10 +33,10 @@ FP 思想值得融入非 FP 语言,如 Python。Java 8 也从中吸收并支
|
||||
|
||||
|
||||
<!-- Old vs. New -->
|
||||
## 旧vs新
|
||||
## 新旧对比
|
||||
|
||||
|
||||
通常,方法会根据我们传递的数据产生不同的结果。 如果您希望某个方法在从一个调用到下一个调用时表现不同,该怎么办? 如果我们将代码传递给方法,我们可以控制它的行为。 以前,我们通过在方法中创建包含所需行为的对象,然后将该对象传递给我们想要控制的方法来完成此操作。 以下示例显示了这一点,然后添加了 Java 8方法:方法引用和 lambda 表达式。
|
||||
通常,方法会根据我们传递的数据产生不同的结果。如果我们希望某个方法在下一次调用时表现不同,该怎么办? 假设我们可以将代码传递给方法,我们就可以控制它的行为。此前,我们通过在方法中创建包含所需行为的对象,然后将该对象传递给我们想要控制的方法来完成此操作。下面我们用传统形式和 Java 8 的方法引用和 lambda 表达式分别演示。代码示例:
|
||||
|
||||
```java
|
||||
// functional/Strategize.java
|
||||
@@ -64,12 +64,15 @@ public class Strategize {
|
||||
strategy = new Soft(); // [1]
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
void communicate() {
|
||||
System.out.println(strategy.approach(msg));
|
||||
}
|
||||
|
||||
void changeStrategy(Strategy strategy) {
|
||||
this.strategy = strategy;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Strategy[] strategies = {
|
||||
new Strategy() { // [2]
|
||||
@@ -88,31 +91,34 @@ public class Strategize {
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Output:
|
||||
```
|
||||
|
||||
输出结果:
|
||||
|
||||
```
|
||||
hello there?
|
||||
HELLO THERE!'
|
||||
Hello
|
||||
Hello there Hello there
|
||||
*/
|
||||
```
|
||||
|
||||
**Strategy** 提供了在其单一 **approach()** 方法中承载功能的接口。 通过创建不同的 **Strategy** 对象,您可以创建不同的行为。
|
||||
**Strategy** 接口提供了单一 `approach()` 方法来承载函数式功能。通过创建不同的 **Strategy** 对象,我们可以创建不同的行为。
|
||||
|
||||
传统上,我们通过创建一个实现 **Strategy** 接口的类来实现此行为,比如在 **Soft** 。
|
||||
传统上,我们通过创建一个实现 **Strategy** 接口的类来实现此行为,比如在 **Soft**。
|
||||
|
||||
**[1] **在**Strategize** 中,您可以看到 **Soft** 是默认策略,因为它是在构造函数中分配的。
|
||||
- **[1]** 在 **Strategize** 中,**Soft** 作为默认策略,在初始化构造函数中赋值的。
|
||||
|
||||
**[2]** 一种略显冗长且更自发的方法是创建一个匿名的内部类。仍然有相当数量的重复代码,你总是要看它,直到你说 “ 哦,我明白,他们正在使用一个匿名的内部类。”
|
||||
- **[2]** 一种略显冗长且更自发的方法是创建一个**匿名内部类**。即使这样,仍有相当数量的冗余代码。你总是要仔细观察:“哦,原来这样,这里使用了匿名内部类。”
|
||||
|
||||
**[3] **这是 **Java 8 lambda** 表达式,由箭头 **->** 分隔开参数和函数体,箭头左边是参数,箭头右侧是从lambda返回的表达式,即函数体。这实现了与类定义和匿名内部类相同的效果,但代码少得多。
|
||||
- **[3]** Java 8 的 Lambda 表达式。由箭头 `->` 分隔开参数和函数体,箭头左边是参数,箭头右侧是从 Lambda 返回的表达式,即函数体。这实现了与定义类、匿名内部类相同的效果,但代码少得多。
|
||||
|
||||
**[4]** 这是Java 8 的*方法引用*,由 **::** 区分。在 **::** 的左边是类或对象的名称,在 **::** 的右边是方法的名称,但没有参数列表。
|
||||
- **[4]** Java 8 的**方法引用**,由 `::` 区分。在 `::` 的左边是类或对象的名称,在 `::` 的右边是方法的名称,但没有参数列表。
|
||||
|
||||
**[5]** 在使用默认的 **Soft** **strategy** 之后,我们逐步遍历数组中的所有策略,并使用 **changeStrategy()**将每个策略放入 **s** 中。
|
||||
- **[5]** 在使用默认的 **Soft** **strategy** 之后,我们逐步遍历数组中的所有 **Strategy**,并使用 `changeStrategy()` 方法将每个 **Strategy** 放入 变量 `s` 中。
|
||||
|
||||
[6]现在,每次调用**communic()**都会产生不同的行为,具体取决于此刻正在使用的策略 “代码对象”。我们传递行为,而不是仅传递数据。[^3]
|
||||
- **[6]** 现在,每次调用 `communic()` 都会产生不同的行为,具体取决于此刻正在使用的策略**代码对象**。我们传递的是行为,而非仅数据。[^3]
|
||||
|
||||
在Java 8之前,我们已经能够通过[1]和[2]传递功能。但是,写入和读取的语法非常笨拙,我们只在强制时才这样做。 方法引用和lambda表达式可以在您需要时传递功能,而不是仅在必要时传递功能。
|
||||
在 Java 8 之前,我们能够通过 **[1]** 和 **[2]** 的方式传递功能。然而,它的读写语法非常笨拙,并且我们别无选择。方法引用和 Lambda 表达式的出现让我们可以在需要时**传递功能**,而不是仅在必要才这么做。
|
||||
|
||||
|
||||
<!-- Lambda Expressions -->
|
||||
|
||||
Reference in New Issue
Block a user