采用两个单独的过滤标准,使用Lambdaj

时间:2012-06-20 08:29:42

标签: java functional-programming filtering lambdaj

使用Lambdaj,我试图从列表中隔离满足2个单独条件的对象。以下两个都将实现我的目标。 A)

    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过滤集合时是否有更简洁的方法来处理两个不同的条件?

1 个答案:

答案 0 :(得分:8)

删除中间定义不是“更多的精神”,并且通常会损害可读性。有一个中间定义有助于让程序的每一行都更容易阅读,并且当你可以给标识符一个有意义的名字时可以提供很好的可读性帮助 - 不确定你的代码中是否真的如此。

我认为,您可以通过不应用两个过滤操作select然后selectFirst来获得可读性,但只使用一个将两个匹配条件与{{1}相结合的操作(注意,代码未经测试):

and