我使用的是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);
有没有办法根据字段的值过滤一些对象。如果可能的话,我不想为此使用匿名类。
感谢。
答案 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;
}
}
}