@@ -28,44 +28,64 @@ permalink: "/zh-cn/scala3/book/:title.html"
28
28
例如,假设你有一个名字列表——一个 ` List[String] ` ——都是小写的,你想找到所有以字母 ` "j" ` 开头的名字,并且把找出来的名字大写。
29
29
在 FP 中,您编写以下代码:
30
30
31
+ {% tabs fp-list %}
32
+ {% tab 'Scala 2 and 3' %}
31
33
``` scala
32
34
val a = List (" jane" , " jon" , " mary" , " joe" )
33
35
val b = a.filter(_.startsWith(" j" ))
34
36
.map(_.capitalize)
35
37
```
38
+ {% endtab %}
39
+ {% endtabs %}
36
40
37
41
如图所示,您不会改变原始列表 ` a ` 。
38
42
相反,您将过滤和转换函数应用于 ` a ` 以创建一个新集合,并将该结果分配给新的不可变变量 ` b ` 。
39
43
40
44
同样,在 FP 中,您不会创建具有可变 ` var ` 构造函数参数的类。
41
45
也就是说,你不要这样写:
42
46
47
+ {% tabs fp--class-variables %}
48
+ {% tab 'Scala 2 and 3' %}
43
49
``` scala
44
50
// don’t do this in FP
45
51
class Person (var firstName : String , var lastName : String )
46
52
--- ---
47
53
```
54
+ {% endtab %}
55
+ {% endtabs %}
48
56
49
57
相反,您通常创建 ` case ` 类,其构造函数参数默认为 ` val ` :
50
58
59
+ {% tabs fp-immutable-case-class %}
60
+ {% tab 'Scala 2 and 3' %}
51
61
``` scala
52
62
case class Person (firstName : String , lastName : String )
53
63
```
64
+ {% endtab %}
65
+ {% endtabs %}
54
66
55
67
现在你创建一个 ` Person ` 实例作为 ` val ` 字段:
56
68
69
+ {% tabs fp-case-class-creation %}
70
+ {% tab 'Scala 2 and 3' %}
57
71
``` scala
58
72
val reginald = Person (" Reginald" , " Dwight" )
59
73
```
74
+ {% endtab %}
75
+ {% endtabs %}
60
76
61
77
然后,当您需要对数据进行更改时,您可以使用 ` case ` 类附带的 ` copy ` 方法来“在制作副本时更新数据”,如下所示:
62
78
79
+ {% tabs fp-case-class-copy %}
80
+ {% tab 'Scala 2 and 3' %}
63
81
``` scala
64
82
val elton = reginald.copy(
65
83
firstName = " Elton" , // update the first name
66
84
lastName = " John" // update the last name
67
85
)
68
86
```
87
+ {% endtab %}
88
+ {% endtabs %}
69
89
70
90
还有其他处理不可变集合和变量的技术,但希望这些示例能让您尝试一下这些技术。
71
91
0 commit comments