1. 閉包代表(定義)了一段代碼(操作):光看這一句,其實方法也能實現相同的功能呀。
2. 閉包可以作為方法的參數:這才是閉包的特殊之處和真正意義。
下面演示一個只有閉包能做,方法做不到的例子。
方法的作用是提煉共性,再代之以不同的參數。即對不同的“數據”進行相同的“操作”。從3個loop可以看出:
????Comm1:相同的數據
????Comm2:相同的for循環
????Diff1:循環體內執行的操作不同
Comm1很好搞定,參數aa就是提煉出的共性
Comm2看似是共性,卻很難提煉,因為for循環和循環體內的操作實際是一個整體;Comm2被Diff1糾纏,3個loop是完全不同的3組操作,無法提煉。
比如,如果現在想要按照奇數循環,只能依次改動三個循環。?
int
[]?aa?
=
?[
1
,?
2
,?
3
,?
4
,?
5
,?
6
]
//
?loop1
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i
++
)?{ ????println?aa[i] }
//
?loop2
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i
++
)?{ ????print?aa[i] }
//
?loop3
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i
++
)?{ ????print?aa[i]?
+
?
'
?
'
}
|
????????
//
?loop1
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i?
+=
?
2
)?{ ????println?aa[i] }
//
?loop2
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i?
+=
?
2
)?{ ????print?aa[i] }
//
?loop3
for
?(
int
?i?
=
?
0
;?i?
<
?aa.length;?i?
+=
?
2
)?{ ????print?aa[i]?
+
?
'
?
'
}
|
下面我們看看閉包的強大之處,Comm1和Comm2都被很好的封裝在了loop方法里;
Diff1則作為參數(閉包)傳入loop方法。
static?void?main(String[]?a)?{
????int[]?aa?=?[1,?2,?3,?4,?5,?6]
????loop(aa)?{?println?it }
??? loop(aa)?{?print?it?}???
??? loop(aa)?{?print?it?+?'?'?}
}
|
如果我們想要改變循環的方式,只需要改一處
static?void?loop(int[]?aa,?Closure?c)?{ ????for?(int?i?=?0;?i?<?aa.length;?i++)?{ ????????c.call(aa[i]) ????} ????println?'?' } | static?void?loop(int[]?aa,?Closure?c)?{ ????for?(int?i?=?0;?i?<?aa.length;?i?+=?2)?{ ????????c.call(aa[i]) ????} ????println?'?' } |
總結,閉包本身并沒什么難點,關鍵是怎樣合理的設計一個接受Closure類型參數的方法。從GDK的方法也可以看出,大多數接受閉包的方法都是和數組迭代有關(也即循環)。
posted on 2008-11-07 02:04
Jcat 閱讀(1546)
評論(2) 編輯 收藏 所屬分類:
Java