有人能把我从我掉进的LambdaJ坑里救出来吗?
假设我有一个此类对象的列表:
private class TestObject {
private String A;
private String B;
//gettters and setters
}
假设我想从A.equals(B)
所在的列表中选择对象
我试过这个:
List<TestObject> theSameList = select(testList, having(on(TestObject.class).getA(), equalTo(on(TestObject.class).getB())));
但这会返回一个空列表
这个:
List<TestObject> theSameList = select(testList, having(on(TestObject.class).getA().equals(on(TestObject.class).getB())));
但这引发了一个异常[EDIT:由于代理最终类的已知限制]
注意,解决这一问题的一种方法是使用一种方法来比较TestObject
中的两个字段,但假设由于您的选择,我无法做到这一点。
我错过了什么?
在用LambdaJ在同一对象的字段上进行匹配之后,唯一对我有效的解决方案就是编写一个自定义匹配器。以下是一个可以完成任务的快速而肮脏的实现:
private Matcher<Object> hasPropertiesEqual(final String propA, final String propB) {
return new TypeSafeMatcher<Object>() {
public void describeTo(final Description description) {
description.appendText("The propeties are not equal");
}
@Override
protected boolean matchesSafely(final Object object) {
Object propAValue, propBValue;
try {
propAValue = PropertyUtils.getProperty(object, propA);
propBValue = PropertyUtils.getProperty(object, propB);
} catch(Exception e) {
return false;
}
return propAValue.equals(propBValue);
}
};
}
PropertyUtils
是来自org.apache.commons.beanutils
的类
使用这种匹配器的方法:
List<TestObject> theSameList = select(testList, having(on(TestObject.class), hasPropertiesEqual("a", "b")));