2014-09-26 78 views
0

有人能讓我離開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()))); 

而是拋出異常[編輯:由於進行代理final類的已知限制]

注意,解決此獲得的一種方式是有兩個字段比較裏面的方法TestObject,但讓我們假設我不能這樣做是因爲您選擇的原因。

我錯過了什麼?

回答

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

PropertyUtilsorg.apache.commons.beanutils

類使用這種匹配方式:

List<TestObject> theSameList = select(testList, having(on(TestObject.class), hasPropertiesEqual("a", "b")));