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())));

但这引发了一个异常[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")));

相关内容

  • 没有找到相关文章

最新更新