2012-06-20 57 views
2

使用Lambdaj,我試圖從列表中分離滿足2個單獨條件的對象。以下兩項將實現我的目標。 A)使用兩個單獨的過濾標準,使用Lambdaj

List<SomeObject> someObjectsWithMatchingSomeObjectIds = select(foo.getSomeParentObject().getSomeObjects(), having(on(
      SomeObject.class).getId(), equalTo(123))); 
    SomeObject someObject = selectFirst(someObjectsWithMatchingSomeObjectIds, having(on(SomeObject.class).getLoanTerm(), 
      notNullValue())); 

B)

SomeObject someObject = selectFirst(select(foo.getSomeParentObject().getSomeObjects(), having(on(SomeObject.class) 
      .getId(), equalTo(123))), having(on(SomeObject.class).getLoanTerm(), notNullValue())); 

第一次似乎更具可讀性,特別是人誰是不熟悉的API。第二個似乎利用lambdaj的函數編程方面,這是最好的?

可讀性勝我想。但是,我想知道,使用LambdaJ過濾集合時,是否有更簡潔的方式來處理兩個單獨的條件?

回答

8

刪除中間定義不是「更多精神上的東西」,並且通常會傷害可讀性。具有中間定義有助於讓程序的每一行更易於閱讀,並且可以在爲標識符提供有意義的名稱時提供很好的可讀性幫助 - 不確定代碼中是否真的存在這種情況。

你可以有一個可讀性勝利,我想,通過不施加兩個過濾操作,select然後selectFirst,但使用的是同一個and結合了這兩種匹配條件(注意,代碼未測試)只需一個人操作:

SomeObject someObject = selectFirst(foo.getSomeParentObject().getSomeObjects(), 
            and(having(on(SomeObject.class).getId(), equalTo(123)), 
             having(on(SomeObject.class).getLoanTerm(), notNullValue())); 
+0

謝謝你的回覆!這個'和'功能似乎正是我所追求的。你可以給我寄一個包裹嗎?(看不到任何明顯的東西)?它是hamcrest還是lambdaj? – HellishHeat

+1

此外,「當你可以給標識符一個有意義的名字 - 不確定它確實是你的代碼中的情況。」苛刻!很明顯,我已經改變了我的對象的名稱爲這篇文章:)。再次感謝你的幫助。 – HellishHeat

+1

我正在考慮Lambdaj中的[AndMatcher](http://lambdaj.googlecode.com/svn/trunk/html/apidocs/index.html)類的靜態構造函數'和'。 – gasche