2012年9月30日 星期日

再談 Closure

上一篇講了,閉包是物件,不是方法,雖然使用上真的很像,這裡我們直接做證明…



  Closure comparator = { String a, String b ->
    a.compareToIgnoreCase(b)
  }
這樣很明白了吧,Closure的確是物件。差別在這個物件把自己當參數傳入某個方法後,這個方法會執行 Closure裡的行為。 當然在宣告的時候和傳統的「方法」不同,你要用 { } 括起來,而且要寫 = 。 參數也不是方法一樣的宣告方式,不過概念是一樣的。 只要能接受語法後,就把它想成「動態的方法」就好了。 在書上的例子寫到


Closure comparator = { String a, String b ->
   a.compareToIgnoreCase(b)
}
List fruit = [ "apple", "Orange", "Avocado", "pear", "cherry" ]
fruit.sort(comparator)
println "Sorted fruit: ${fruit}"

這是一種寫法。先定義好有名有姓的閉包,當然 sort 也要接受這樣的閉包,不然你也是白寫的。 能夠變的地方在裡面實作的「比較方式」而已。 若還記得我們上篇文章,那是一種更直接寫的寫法。就像暱名的方法一樣。

 rpt_list.sort{o1,o2->
    o1.total<=>o2.total
 }
後面還會很大量的使用 Closure,所以目前暫時還不習慣也是無所謂的。

沒有留言:

張貼留言