Javaライブラリ(Commons)Collections 2 絞込、編集、実行 | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

前回、Commons CollectionsをダウンロードできるURL書いてませんでしたね。
簡単に分かるだろうけど、一応。

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));


テストコードは匿名クラスになってますが
これを通常のクラスにすれば

List<String> sel = (List<String>) CollectionUtils.select(arr, ~); //絞込
List<String> tran = (List<String>) CollectionUtils.collect(sel, ~); //編集
CollectionUtils.forAllDo(tran, ~); //実行

となります。
私のライブラリのように繋げて書くことはできないけど
ずっと高性能です。

内部的には私のものと大差ないようなことをしてました。
イテレータでループさせて順次、処理したり条件分岐したり。

このCollectionsUtilsを使えばループや条件の少ない
可読性の高いコードが書けそうですね。