JunkUtil 1.0.3では、LzList、LzMapそれぞれにメソッドforEachが実装されました。 このメソッドは、クロージャを実現するためのものです。
LzList#forEachの引数にLzListClosureの匿名クラスを、LzMap#forEachの引数にLzMapClosureの匿名クラスを利用することで、それぞれクロージャを実現しています。
匿名クラスからは、final変数を参照できるため、以下のような記述が可能です。
public void testLzClosure() throws Exception {
List list1 = Arrays.asList(new String[]{"AAA", "ABB", "CCC"});
final String var = "A";
LzList grep = new LzList(list1).forEach(new LzListClosure(){
public boolean process(int i, int len, Object obj) {
String str = (String)obj;
return str.startsWith(var);
}
});
assertTrue(grep.equals("[AAA, ABB]"));
}
上記のサンプルは冗長でしょうか?
しかしこのクロージャ機能は、Beanの入ったListやMapを処理するときにこそその真価を発揮します。
特定のBeanだけを抜き出すクロージャ、特定のBeanだけ更新するクロージャ、全てのBeanの共通メソッドを呼び出すクロージャ、などなど。プログラマはクロージャを書き、名前をつけ、再利用することができます。
クロージャを完全にマスターしたとき、プログラマはもはや多くのfor文が要らなくなったことに気付くでしょう。