0

有人能把我从我掉进的 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,但我们假设由于您选择的原因我不能这样做。

我错过了什么?

4

1 回答 1

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")));
于 2014-10-06T14:25:57.960 回答