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