有人能让我离开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())));
但是会引发异常[编辑:由于代理最终类的已知限制]
注意,解决此问题的一种方法是使用一种方法来比较TestObject
中的两个字段,但我们假设我不能这样做是出于您的选择。
我错过了什么?
答案 0 :(得分:0)
在挖掘和摆弄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")));