复制代码
1一、直接摆例子
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145/** * Created by Administrator on 2016/8/6. */ /** * 闭包的使用 * 避免了代码的冗长,可以辅助创建轻量级可复用的代码片段 */ print("n闭包的使用:") def pickEven(n, block) { for (int i = 2; i <= n; i += 2) { block(i) } println() } pickEven(6, { print it }) pickEven(6) { eventNum -> print eventNum } def totalSelectValues(n, closure) { total = 0 for (i in 1..n) { if (closure(i)) { total += i } } total//没有显示的return 则返回最后一个 } def isOdd = { it % 2 != 0 } println totalSelectValues(10, isOdd) /** * 闭包的作用范围:只有在闭包被定义且存在,而不是在被调用时可以访问其状态值 */ println("n闭包的作用范围:") def greeting ='Hello' def clos ={param -> println "${greeting} ${param}"} clos.call("world") greeting ='Welcome' clos.call('Ken') def demo(clo){ def greeting = 'Bonjour' clo.call('Ken') } demo(clos) /** * 闭包在实参列表外部 */ greeting ='Hello' clos ={param -> println "${greeting} ${param}"} demo(clo){ greeting = 'Bonjour' clo.call('Ken') } //demo() clos //报错 demo() {param -> println "${greeting} ${param}"} demo clos demo {param -> println "${greeting} ${param}"} /** * 向闭包传递参数 * 对于单参数,it是该参数的默认名称 * 如果多余一个参数,就得一一列出 */ println("n向闭包传递参数:") def tellFortune(closure) { closure new Date("09/20/2016"), "your day!!" } tellFortune() { date, fortune -> println "Fortune for $date id $fortune" } /** * update 的用法 */ def iterate(n, closure) { 1.upto(n) { println "in iterate with value n is ${it}" closure(it) } } total = 0 closure = { total += it// 每次调用闭包,都会恢复到上一次的total值 println "in closure value total is ${total}" } iterate(4, closure) /** * curry 闭包 * 在多次调用同一个闭包的时候,有一个或者多个实参是相同的,传参就会很枯燥 * 可以预先绑定某个形参,调用闭包的时候就不必重复为这个闭包提供参数了 */ def tellFortunes(closure) { Date date = new Date("09/20/2016") // closure date,"first" // closure date,"second" //postForturn 保存着保存着科里化后的闭包引用,已经绑定了date数据 postFortune = closure.curry(date) postFortune "first" postFortune "second" } tellFortunes() { date, forturn -> println "Fortunes for ${date} is ${forturn}" } /** * 动态闭包 * 1根据闭包是否参在 * 2参数数目closure.maximumNumberOfParameters * 3参数类型closure.paremeterTypes */ def doSomething(closure) { if (closure) { closure() } else { println "Using default" } } doSomething() doSomething() { println "doSomething with closure" } /** * 使用尾递归编写程序 * 递归程序转换成迭代过程,提高性能 * * */ def factorial factorial = { int number, int theFcatorial -> number == 1 ? theFcatorial : factorial.trampoline(number - 1, number * theFcatorial) }.trampoline() println "factorial 5 value is ${factorial(5, 1)}"
最后
以上就是现代高山最近收集整理的关于Groovy (三) 闭包的使用-----极速入门总结的全部内容,更多相关Groovy内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复