Javaと情熱のあいだ

カステラとドーナツと珈琲

Listに格納されたBeanを抽出するサンプル

for、if文を使用しないでListに格納されたBeenを特定の条件にしたがって抽出する。
まずBeanPredicate、PredicateUtilsで条件を作成して
CollectionUtils.selectで実行すると条件に合ったBeanが抽出される。
条件はAND、OR、NULL、NOTNULLなどが指定でき値が重複した
Beanを抽出すこともできる。また、異なるBeanが混在していても
メンバ名が同じなら抽出することができる。
メンバ名が片方にしか無い場合は例外がスローされる。
今回のサンプルはhogeに入った値で絞りこみを実行する。
材料は下記のものを使用。
org.apache.commons.beanutils
org.apache.commons.collections
org.apache.commons.lang

    /**
     *
     * 実行。
     * @throws Exception 例外
     */
    @Override
    public void execute() throws Exception {

        final List<TestInterface> list = new ArrayList<TestInterface>();

        while (list.size() < 100) {
            list.add(new TestBean(RandomUtils.nextInt(10)));
        }

        // 絞込み条件
        BeanPredicate beanPredicate =
            new BeanPredicate("hoge", PredicateUtils.equalPredicate(0));

        List<TestInterface> targetList = new ArrayList<TestInterface>();

        targetList.addAll(CollectionUtils.select(list, beanPredicate));

        for (final TestInterface tb : targetList) {
            System.out.println(ToStringBuilder.reflectionToString(
                    tb, ToStringStyle.SHORT_PREFIX_STYLE));
        }


        // OR条件
        beanPredicate =
            new BeanPredicate("hoge", PredicateUtils.orPredicate(
                    PredicateUtils.equalPredicate(1),
                    PredicateUtils.equalPredicate(2)));

        targetList = new ArrayList<TestInterface>();

        targetList.addAll(CollectionUtils.select(list, beanPredicate));

        for (final TestInterface tb : targetList) {
            System.out.println(ToStringBuilder.reflectionToString(
                    tb, ToStringStyle.SHORT_PREFIX_STYLE));
        }


        // Bean混在
        while (list.size() < 200) {
            list.add(new SampleBean(RandomUtils.nextInt(10)));
        }

        beanPredicate =
            new BeanPredicate("hoge", PredicateUtils.equalPredicate(9));

        targetList = new ArrayList<TestInterface>();

        targetList.addAll(CollectionUtils.select(list, beanPredicate));

        for (final TestInterface tb : targetList) {
            System.out.println(ToStringBuilder.reflectionToString(
                    tb, ToStringStyle.SHORT_PREFIX_STYLE));
        }


    }

    /**
     *
     * <HR>
     * <P>
     *  ■モジュール名 <BR>
     * <BLOCKQUOTE>
     *      Test.java <BR>
     * </BLOCKQUOTE>
     * <P>
     *  ■クラス仕様 <BR>
     * <BLOCKQUOTE>
     *      TestクラスはBeanクラスです。<BR>
     * </BLOCKQUOTE>
     * <P>
     * <HR>
     * <P>
     */
    public class TestBean implements TestInterface {

        /**
         * 確認用数値
         */
        private int hoge;

        /**
         *
         * コンストラクタ
         * @param hoge 確認用数値
         */
        public TestBean(final int hoge) {
            this.hoge = hoge;
        }

        /**
         *
         * 確認用数値の取得
         * @return 確認用数値
         */
        public int getHoge() {
            return hoge;
        }

        /**
         *
         * 確認用数値の設定
         * @param hoge 確認用数値
         */
        public void setHoge(final int hoge) {
            this.hoge = hoge;
        }
    }

    /**
     *
     * <HR>
     * <P>
     *  ■モジュール名 <BR>
     * <BLOCKQUOTE>
     *      SampleBean.java <BR>
     * </BLOCKQUOTE>
     * <P>
     *  ■クラス仕様 <BR>
     * <BLOCKQUOTE>
     *      SampleBeanクラスはBeanクラスです。<BR>
     * </BLOCKQUOTE>
     * <P>
     * <HR>
     * <P>
     */
    public class SampleBean implements TestInterface  {

        /**
         * 確認用数値
         */
        private int hoge;

        /**
         *
         * コンストラクタ
         * @param hoge 確認用数値
         */
        public SampleBean(final int hoge) {
            this.hoge = hoge;
        }

        /**
         *
         * 確認用数値の取得
         * @return 確認用数値
         */
        public int getHoge() {
            return hoge;
        }

        /**
         *
         * 確認用数値の設定
         * @param hoge 確認用数値
         */
        public void setHoge(final int hoge) {
            this.hoge = hoge;
        }
    }

    /**
     *
     * <HR>
     * <P>
     *  ■モジュール名 <BR>
     * <BLOCKQUOTE>
     *      TestInterface.java <BR>
     * </BLOCKQUOTE>
     * <P>
     *  ■クラス仕様 <BR>
     * <BLOCKQUOTE>
     *      TestInterfaceクラスはInterfaceクラスです。<BR>
     * </BLOCKQUOTE>
     * <P>
     * <HR>
     * <P>
     */
    public interface TestInterface {
        // 確認用なので定義は空
    }

ListUtils.selectが無いのかなと思って探したけれど無かった。
上手く探せてないだけかな・・・orz