LambdaJ:匹配同一对象的字段

时间:2014-09-26 09:31:49

标签: java hamcrest lambdaj

有人能让我离开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中的两个字段,但我们假设我不能这样做是出于您的选择。

我错过了什么?

1 个答案:

答案 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")));