簡単に分かるだろうけど、一応。
http://commons.apache.org/proper/commons-collections/download_collections.cgi
overviewのページも概要が載ってるので目を通すと良いです。
前回、Commons Collectionsを紹介しましたが
まだまだ便利なクラスやインタフェースは多く存在し、
その中でもこれはと思ったのがありました。
今まで関数型言語のように記述すると
読みやすいコードになるという事で
関数型言語のように使えるライブラリを
作ったりしてましたが同じように使えるものが
Commons Collectionsに存在しました。
同じものというか当然、私のより高機能です・・
CollectionsUtilsというコレクションを便利に使う機能が
集まったクラスがあります。
その中のselect, collect, forAllDoというメソッドが該当します。
それぞれコレクションの絞込、各要素毎の編集、各要素毎の実行
を行います。
ダラダラ説明するよりテストコードを見た方が
分かりやすいでしょう。
List<String> arr = new ArrayList<String>();
arr.add("AAA");
arr.add("ABC");
arr.add("CCC");
//絞り込み
List<String> sel = (List<String>) CollectionUtils.select(arr, new Predicate<String>(){
@Override
public boolean evaluate(String arg0) {
return arg0.indexOf("A") >= 0;
}
});
//編集
List<String> tran = (List<String>) CollectionUtils.collect(sel,
new Transformer<String, String>(){
@Override
public String transform(String arg0) {
return "#" + arg0 ;
}
});
//実行
CollectionUtils.forAllDo(tran, new Closure<String>(){
@Override
public void execute(String arg0) {
System.out.println("arr = " + arg0);
}
});
assertEquals("size", 2, tran.size());
assertEquals("first", "#AAA", tran.get(0));
assertEquals("second", "#ABC", tran.get(1));
arr.add("AAA");
arr.add("ABC");
arr.add("CCC");
//絞り込み
List<String> sel = (List<String>) CollectionUtils.select(arr, new Predicate<String>(){
@Override
public boolean evaluate(String arg0) {
return arg0.indexOf("A") >= 0;
}
});
//編集
List<String> tran = (List<String>) CollectionUtils.collect(sel,
new Transformer<String, String>(){
@Override
public String transform(String arg0) {
return "#" + arg0 ;
}
});
//実行
CollectionUtils.forAllDo(tran, new Closure<String>(){
@Override
public void execute(String arg0) {
System.out.println("arr = " + arg0);
}
});
assertEquals("size", 2, tran.size());
assertEquals("first", "#AAA", tran.get(0));
assertEquals("second", "#ABC", tran.get(1));
テストコードは匿名クラスになってますが
これを通常のクラスにすれば
List<String> sel = (List<String>) CollectionUtils.select(arr, ~); //絞込
List<String> tran = (List<String>) CollectionUtils.collect(sel, ~); //編集
CollectionUtils.forAllDo(tran, ~); //実行
となります。
私のライブラリのように繋げて書くことはできないけど
ずっと高性能です。
内部的には私のものと大差ないようなことをしてました。
イテレータでループさせて順次、処理したり条件分岐したり。
このCollectionsUtilsを使えばループや条件の少ない
可読性の高いコードが書けそうですね。