Skip to content

Commit cd35ca1

Browse files
authored
Merge pull request lingcoder#177 from xiangflight/master
[revision 13](截至 多参数函数式接口)
2 parents e108b6d + 9884846 commit cd35ca1

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

docs/book/13-Functional-Programming.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -630,25 +630,25 @@ public class FunctionalAnnotation {
630630

631631
`@FunctionalInterface` 注解是可选的; Java 在 `main()` 中把 **Functional****FunctionalNoAnn** 都当作函数式接口。 `@FunctionalInterface` 的值在 `NotFunctional` 的定义中可见:接口中如果有多个方法则会产生编译时错误消息。
632632

633-
仔细观察在定义 `f``fna` 时发生了什么。 `Functional``FunctionalNoAnn` 定义接口,然而被赋值的只是方法 `goodbye()`。首先,这只是一个方法而不是类;其次,它甚至都不是实现了该接口的类中的方法。Java 8 在这里添加了一点小魔法:如果将方法引用或 Lambda 表达式赋值给函数接口(类型需要匹配),Java 会适配你的赋值到目标接口。 编译器会自动包装方法引用或 Lambda 表达式到实现目标接口的类的实例中。
633+
仔细观察在定义 `f``fna` 时发生了什么。 `Functional``FunctionalNoAnn` 定义接口,然而被赋值的只是方法 `goodbye()`。首先,这只是一个方法而不是类;其次,它甚至都不是实现了该接口的类中的方法。Java 8 在这里添加了一点小魔法:如果将方法引用或 Lambda 表达式赋值给函数式接口(类型需要匹配),Java 会适配你的赋值到目标接口。 编译器会自动包装方法引用或 Lambda 表达式到实现目标接口的类的实例中。
634634

635635
尽管 `FunctionalAnnotation` 确实适合 `Functional` 模型,但 Java 不允许我们将 `FunctionalAnnotation``fac` 定义一样直接赋值给 `Functional`,因为它没有明确地实现 `Functional` 接口。 令人惊奇的是 ,Java 8 允许我们以简便的语法为接口赋值函数。
636636

637637
`java.util.function` 包旨在创建一组完整的目标接口,使得我们一般情况下不需再定义自己的接口。这主要是因为基本类型会产生一小部分接口。 如果你了解命名模式,顾名思义就能知道特定接口的作用。
638638

639639
以下是基本命名准则:
640640

641-
1. 如果只处理对象而非基本类型,名称为 `Function``Consumer``Predicate` 等。参数类型通过泛型添加。
641+
1. 如果只处理对象而非基本类型,名称则为 `Function``Consumer``Predicate` 等。参数类型通过泛型添加。
642642

643-
2. 如果是基本类型,则由名称的第一部分表示,如 `LongConsumer``DoubleFunction``IntPredicate` 等,但基本 `Supplier` 类型例外。
643+
2. 如果接收的参数是基本类型,则由名称的第一部分表示,如 `LongConsumer``DoubleFunction``IntPredicate` 等,但基本 `Supplier` 类型例外。
644644

645645
3. 如果返回值为基本类型,则用 `To` 表示,如 `ToLongFunction <T>``IntToLongFunction`
646646

647647
4. 如果返回值类型与参数类型一致,则是一个运算符:单个参数使用 `UnaryOperator`,两个参数使用 `BinaryOperator`
648648

649-
5. 如果是 2 个参数且返回值为布尔值,则是一个谓词(Predicate)。
649+
5. 如果接收两个参数且返回值为布尔值,则是一个谓词(Predicate)。
650650

651-
6. 如果是两个参数类型不同,则名称中有一个 `Bi`
651+
6. 如果接收的两个参数类型不同,则名称中有一个 `Bi`
652652

653653
下表描述了 `java.util.function` 中的目标类型(包括例外情况):
654654

@@ -669,15 +669,15 @@ public class FunctionalAnnotation {
669669
|2 参数类型不同|**Bi操作** <br> (不同方法名)|**`BiFunction<T,U,R>` <br> `BiConsumer<T,U>` <br> `BiPredicate<T,U>` <br> `ToIntBiFunction<T,U>` <br> `ToLongBiFunction<T,U>` <br> `ToDoubleBiFunction<T>`**|
670670

671671

672-
  此表仅提供些常规方案。通过上表,你应该或多或少能自行推导出更多行的函数式接口。
672+
此表仅提供些常规方案。通过上表,你应该或多或少能自行推导出更多行的函数式接口。
673673

674-
能看出来在创建 `java.util.function` 时,设计者做出了一些选择
674+
可以看出,在创建 `java.util.function` 时,设计者们做出了一些选择
675675

676-
例如,为什么没有 `IntComparator``LongComparator``DoubleComparator` 呢?有 `BooleanSupplier` 却没有其他表示 **Boolean** 的接口;有通用的 `BiConsumer` 却没有用于 **int****long****double**`BiConsumers` 变体(我对他们放弃的原因表示同情)。这是疏忽还是有人决定(他们是如何得出这个结论的)?
676+
例如,为什么没有 `IntComparator``LongComparator``DoubleComparator` 呢?有 `BooleanSupplier` 却没有其他表示 **Boolean** 的接口;有通用的 `BiConsumer` 却没有用于 **int****long****double**`BiConsumers` 变体(我对他们放弃的原因表示同情)。这些选择是疏忽还是有人认为其他组合的使用情况出现得很少(他们是如何得出这个结论的)?
677677

678-
你还可以看到基本类型给 Java 添加了多少复杂性。为了缓解效率问题,该语言的第一版中就包含了基本类型。现在,在语言的生命周期中,我们仍然受到语言设计选择不佳的影响。
678+
你还可以看到基本类型给 Java 添加了多少复杂性。为了缓和效率问题,该语言的第一版中就包含了基本类型。现在,在语言的生命周期中,我们仍然受到语言设计选择不佳的影响。
679679

680-
下面枚举基于 Lambda 表达式的所有不同 Function 变体的示例:
680+
下面枚举了基于 Lambda 表达式的所有不同 **Function** 变体的示例:
681681

682682
```java
683683
// functional/FunctionVariants.java
@@ -745,7 +745,7 @@ public class FunctionVariants {
745745
}
746746
```
747747

748-
这些 Lambda 表达式尝试生成适合对应函数签名的最简代码。 在某些情况下,有必要进行强制类型转换,否则编译器会报截断错误。
748+
这些 Lambda 表达式尝试生成适合函数签名的最简代码。 在某些情况下,有必要进行强制类型转换,否则编译器会报截断错误。
749749

750750
主方法中的每个测试都显示了 `Function` 接口中不同类型的 `apply()` 方法。 每个都产生一个与其关联的 Lambda 表达式的调用。
751751

@@ -788,7 +788,7 @@ someOtherName()
788788

789789
查看 `BiConsumer` 的文档,你会看到 `accept()` 方法。 实际上,如果我们将方法命名为 `accept()`,它就可以作为方法引用。 但是我们也可用不同的名称,比如 `someOtherName()`。只要参数类型、返回类型与 `BiConsumer``accept()` 相同即可。
790790

791-
因此,在使用函数接口时,名称无关紧要——只要参数类型和返回类型相同。 Java 会将你的方法映射到接口方法。 要调用方法,可以调用接口的函数式方法(在本例中为 `accept()`),而不是你的方法名。
791+
因此,在使用函数接口时,名称无关紧要——只要参数类型和返回类型相同。 Java 会将你的方法映射到接口方法。 要调用方法,可以调用接口的函数式方法名(在本例中为 `accept()`),而不是你的方法名。
792792

793793
现在我们来看看所有基于类的函数式,应用于方法引用(即那些不涉及基本类型的函数)。下例我们创建了一个最简单的函数式签名。代码示例:
794794

0 commit comments

Comments
 (0)