[ISSUE #24]校订第13章函数式编程-函数式接口

This commit is contained in:
LingCoder
2019-04-19 23:52:39 +08:00
parent cf152ef419
commit 01409c19bb

View File

@@ -553,7 +553,7 @@ public class CtorReference {
注意我们如何对 **[1]****[2]** 和 **[3]** 中的每一个使用 `Dog :: new`。 所有三个构造函数只有一个名称:`:: new`。 但是构造函数引用在每种情况下都分配给不同的接口,并且编译器可以知道从哪个构造函数引用中进行检测。 注意我们如何对 **[1]****[2]** 和 **[3]** 中的每一个使用 `Dog :: new`。 所有三个构造函数只有一个名称:`:: new`。 但是构造函数引用在每种情况下都分配给不同的接口,并且编译器可以知道从哪个构造函数引用中进行检测。
编译器可以看到调用函数方法( 在本例中为make())意味着调用构造函数。 编译器可以看到调用函数方法( 在本例中为 `make()`)意味着调用构造函数。
<!-- Functional Interfaces --> <!-- Functional Interfaces -->
## 函数式接口 ## 函数式接口
@@ -565,9 +565,9 @@ public class CtorReference {
x -> x.toString() x -> x.toString()
``` ```
我们看到返回类型必须是String但x是什么类型? 我们看到返回类型必须是 **String**,但 `x` 是什么类型?
因为 Lambda 表达式包含一种类型推断形式(编译器会对类型进行描述,而不是要求程序员显式),编译器必须能够以某种方式推导出 x 的类型。 因为 Lambda 表达式包含一种类型推断形式(编译器会对类型进行描述,而不是要求程序员显式),编译器必须能够以某种方式推导出 `x` 的类型。
这是第二个例子: 这是第二个例子:
@@ -577,7 +577,7 @@ x -> x.toString()
现在 `x``y` 可以是支持 `+` 运算符的任何类型,包括两个不同的数字类型或一个 **String** 以及一些将自动转换为 **String** 的类型(这包括大多数类型)。 但是,当分配此 Lambda 表达式时,编译器必须确定 `x``y` 的确切类型以生成正确的代码。 现在 `x``y` 可以是支持 `+` 运算符的任何类型,包括两个不同的数字类型或一个 **String** 以及一些将自动转换为 **String** 的类型(这包括大多数类型)。 但是,当分配此 Lambda 表达式时,编译器必须确定 `x``y` 的确切类型以生成正确的代码。
同样的问题适用于方法引用。 假设你要传递 System.out :: println 到你正在编写的方法 ,你为方法的参数给出了什么类型? 同样的问题适用于方法引用。 假设你要传递 `System.out :: println` 到你正在编写的方法 ,你为方法的参数给出了什么类型?
为了解决这个问题Java 8 引入了 `java.util.function`,它包含一组接口,这些接口是 Lambda 表达式和方法引用的目标类型。 每个接口只包含一个抽象方法,称为函数式方法。 为了解决这个问题Java 8 引入了 `java.util.function`,它包含一组接口,这些接口是 Lambda 表达式和方法引用的目标类型。 每个接口只包含一个抽象方法,称为函数式方法。