使用带有Predicate的org.apache.commons.collections4.CollectionUtils的find方法

时间:2014-07-21 08:40:04

标签: collections apache-commons

我使用的是org.apache.commons.collections.CollectionUtils,对于这个版本,使用find方法是这样的:

BeanPropertyValueEqualsPredicate objIdEqualsPredicate = new BeanPropertyValueEqualsPredicate("objId", objId);
myObj = (MyClass) CollectionUtils.find(myObjSet, objIdEqualsPredicate);

但是org.apache.commons.collections4.CollectionUtils,我不知道如何让它发挥作用。 这就是我现在所做的,但如果有明确的方法,我将很高兴得知:

Predicate<MyClass> objIdEqualsPredicate = new Predicate<MyClass>() {
    @Override
    public boolean evaluate(MyClass obj) {
        return obj.getObjId().equals(objId);
    }
};
myObj = CollectionUtils.find(myObjSet, objIdEqualsPredicate);

有没有办法根据字段的值过滤一些对象。如果可能的话,我不想为此使用匿名类。

感谢。

1 个答案:

答案 0 :(得分:0)

由于common-beanutils仍然将commons-collections作为依赖项,因此必须实现Predicate接口。

例如,您可以获取BeanPropertyValueEqualsPredicate的源代码并重构它,因此您的版本实现了org.apache.commons.collections4.Predicate接口。

或者您编写自己的版本。我宁愿不使用匿名内部类,因为有可能为谓词编写单元测试并重用它。

快速示例(非nullsafe,..)

@Test
public class CollectionsTest {

@Test
void test() {

    Collection<Bean> col = new ArrayList<>();
    col.add(new Bean("Foo"));
    col.add(new Bean("Bar"));

    Predicate<Bean> p = new FooPredicate("Bar");

    Bean find = CollectionUtils.find(col, p);
    Assert.assertNotNull(find);
    Assert.assertEquals(find.getFoo(), "Bar");

}

private static final class FooPredicate implements Predicate<CollectionsTest.Bean> {

    private String fieldValue;

    public FooPredicate(final String fieldValue) {

        super();
        this.fieldValue = fieldValue;
    }

    @Override
    public boolean evaluate(final Bean object) {

        // return true for a match - false otherwise
        return object.getFoo().equals(fieldValue);
    }
}

public static class Bean {

    private final String foo;

    Bean(final String foo) {

        super();
        this.foo = foo;
    }

    public String getFoo() {

        return foo;
    }
}
}