@@ -19,19 +19,25 @@ permalink: "/zh-cn/scala3/book/:title.html"
19
19
这个特性有很多好处,其中最常见的是(a)您可以定义方法来接受函数参数,以及(b)您可以将函数作为参数传递给方法。
20
20
你已经在本书的多个地方看到了这一点,每当演示像 ` map ` 和 ` filter ` 这样的方法时:
21
21
22
+ {% tabs fp-function-as-values-anonymous %}
23
+ {% tab 'Scala 2 and 3' %}
22
24
``` scala
23
25
val nums = (1 to 10 ).toList
24
26
25
27
val doubles = nums.map(_ * 2 ) // double each value
26
28
val lessThanFive = nums.filter(_ < 5 ) // List(1,2,3,4)
27
29
```
30
+ {% endtab %}
31
+ {% endtabs %}
28
32
29
33
在这些示例中,匿名函数被传递到 ` map ` 和 ` filter ` 中。
30
34
31
35
> 匿名函数也称为 * lambdas* 。
32
36
33
37
除了将匿名函数传递给 ` filter ` 和 ` map ` 之外,您还可以为它们提供 * 方法* :
34
38
39
+ {% tabs fp-function-as-values-defined %}
40
+ {% tab 'Scala 2 and 3' %}
35
41
``` scala
36
42
// two methods
37
43
def double (i : Int ): Int = i * 2
@@ -40,6 +46,8 @@ def underFive(i: Int): Boolean = i < 5
40
46
// pass those methods into filter and map
41
47
val doubles = nums.filter(underFive).map(double)
42
48
```
49
+ {% endtab %}
50
+ {% endtabs %}
43
51
44
52
这种将方法和函数视为值的能力是函数式编程语言提供的强大特性。
45
53
@@ -50,29 +58,45 @@ val doubles = nums.filter(underFive).map(double)
50
58
51
59
正如您在这些示例中看到的,这是一个匿名函数:
52
60
61
+ {% tabs fp-anonymous-function-short %}
62
+ {% tab 'Scala 2 and 3' %}
53
63
``` scala
54
64
_ * 2
55
65
```
66
+ {% endtab %}
67
+ {% endtabs %}
56
68
57
69
如 [ 高阶函数] [ hofs ] 讨论中所示,上面的写法是下面语法的简写版本:
58
70
71
+ {% tabs fp-anonymous-function-full %}
72
+ {% tab 'Scala 2 and 3' %}
59
73
``` scala
60
74
(i : Int ) => i * 2
61
75
```
76
+ {% endtab %}
77
+ {% endtabs %}
62
78
63
79
像这样的函数被称为“匿名”,因为它们没有名字。
64
80
如果你想给一个名字,只需将它分配给一个变量:
65
81
82
+ {% tabs fp-function-assignement %}
83
+ {% tab 'Scala 2 and 3' %}
66
84
``` scala
67
85
val double = (i : Int ) => i * 2
68
86
```
87
+ {% endtab %}
88
+ {% endtabs %}
69
89
70
90
现在你有了一个命名函数,一个分配给变量的函数。
71
91
您可以像使用方法一样使用此函数:
72
92
93
+ {% tabs fp-function-used-like-method %}
94
+ {% tab 'Scala 2 and 3' %}
73
95
``` scala
74
96
double(2 ) // 4
75
97
```
98
+ {% endtab %}
99
+ {% endtabs %}
76
100
77
101
在大多数情况下,` double ` 是函数还是方法并不重要。 Scala 允许您以同样的方式对待它们。
78
102
在幕后,让您像对待函数一样对待方法的 Scala 技术被称为 [ Eta 表达式] [ eta ] 。
@@ -82,6 +106,8 @@ double(2) // 4
82
106
83
107
如果您对将函数作为参数传递给其他函数的过程不适应,可以尝试以下几个示例:
84
108
109
+ {% tabs fp-function-as-values-example %}
110
+ {% tab 'Scala 2 and 3' %}
85
111
``` scala
86
112
List (" bob" , " joe" ).map(_.toUpperCase) // List(BOB, JOE)
87
113
List (" bob" , " joe" ).map(_.capitalize) // List(Bob, Joe)
@@ -100,6 +126,8 @@ nums.sortWith(_ > _) // List(11, 7, 5, 3, 1)
100
126
101
127
nums.takeWhile(_ < 6 ).sortWith(_ < _) // List(1, 3, 5)
102
128
```
129
+ {% endtab %}
130
+ {% endtabs %}
103
131
104
132
[ hofs] : {% link _ zh-cn/overviews/scala3-book/fun-hofs.md %}
105
133
[ eta] : {% link _ zh-cn/overviews/scala3-book/fun-eta-expansion.md %}
0 commit comments