使用两个单独的过滤条件,使用 Lambdaj



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

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

二)

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

第一个似乎更具可读性,特别是对于不熟悉 API 的人来说。第二个似乎利用了lambdaj的函数式编程方面,哪个是最好的?

我想可读性胜出。但是,我想知道,在使用 LambdaJ 过滤集合时,是否有更简洁的方法来处理两个单独的条件?

删除中间定义并不是任何事物的"更符合精神",而且通常会损害可读性。有一个中间定义有助于使程序的每一行都更易于阅读,并且当你可以为标识符提供一个有意义的名称时,可以是一个很好的可读性帮助 - 不确定你的代码中是否真的如此。

我认为,您可以通过不应用两个过滤操作,select然后selectFirst,而是仅使用一个将两个匹配条件与and相结合的操作(请注意,代码未测试):

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

相关内容

  • 没有找到相关文章

最新更新