※數字與閉包的相關方法
※upto、downto
package script
def up(int n) {
def sum = 0
// 1.upto(n) { num -> println num }
// 1.upto(n, {num -> rtn += num})
1.upto(n) { num ->
sum += num
}
sum
}
println up(10)
def down(int n) {
// 10.downto(n) { num -> println num }
// 10.downto(n, {num -> n += num})
10.downto(n) { num -> n += num }
n
}
println down(0)
※因為在參數使用 def 會有 cannot infer argument type ...,所以改成了 int
※閉包在最後一個參數,可以將閉包獨立拿到 () 後面
※times
def add(n) {
def rtn = 0
n = ++n // 因為底層的 size 是 <,不是 <=
// n.times({ num -> rtn += num })
n.times { num -> rtn += num }
rtn
}
println add(10)
※
※字串與閉包的相關方法
※each、eachLine
// each
def s = 'abc'
def rtn = s.each {
st -> print st.multiply(2) // aabbcc
}
println '\r\n' + rtn // abc
// eachLine
def s2 = '''abc
xyz
OGC
'''
def rt = s2.eachLine(0, {
st, i -> println "${i} = ${st}"
})
println rt // null
※eachLine 第一個參數預設為0,index的意思,可以改變起始數字
※find、findAll、any、every、collect、collectReplacements
final def s = 'a1b2c3'
println s.find {
st -> !st.isNumber() // a,找到第一個不是數字的,沒有是 null
}
println s.findAll {
st -> !st.isNumber() // [a, b, c],找到全部都不是數字的,沒有是 null
}
println s.any {
st -> st.isNumber() // true,其中一個是數字就是 true
}
println s.every {
st -> st.isNumber() // false,全部是數字才是 true
}
println s.collect { // 循環每一個 index
st -> st.center(3, "&") // [&a&, &1&, &b&, &2&, &c&, &3&]
}
println s.collectReplacements { // 循環每一個 index 後,判斷是否取代
it == 'a' ? 'A' : it
}
// public static Object find(Object self, Closure closure) {...}
※最後一行註解的部分是原碼,第一個參數是自己去點的內容,可以假裝沒看到
※集合與閉包的相關方法
※def list = ['xxx', 'x', 'xxxxx', 'xx', 'xxxx']
list.sort {
it.size() // it -$gt; return it.size()
}
println list // [x, xx, xxx, xxxx, xxxxx]
def list2 = [9, -5, 2, 7]
println list2.min() // -5
println list2.max { // 9
Math.abs(it)
}
println list2.count {
it % 2 == 0 // 偶數有幾個
}
※
※排序
def list = [1, -7, 2, 3, -6, 8, -4, 5]
/*
Collections.sort(list) { a, b ->
if (a == b) {
0
} else {
Math.abs(a) < Math.abs(b) ? -1 : 1
}
}
*/
list.sort() { a, b ->
if (a == b) {
0
} else {
Math.abs(a) < Math.abs(b) ? -1 : 1
}
}
println list
※
沒有留言:
張貼留言