※數字與閉包的相關方法
※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
※
沒有留言:
張貼留言