2018年7月30日 星期一

閉包與相關方法 (Groovy 2.x 三)

※數字與閉包的相關方法

※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



沒有留言:

張貼留言