【问题标题】:Employing Two Separate Filtering Criteria, using Lambdaj使用两个单独的过滤条件,使用 Lambdaj
【发布时间】:2013-05-27 21:23:33
【问题描述】:

使用 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()));

B)

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

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

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

【问题讨论】:

    标签: java functional-programming filtering lambdaj


    【解决方案1】:

    删除中间定义并不是什么“更符合精神”,而且通常会损害可读性。有一个中间定义有助于使程序的每一行更易于阅读,并且当您可以为标识符赋予一个有意义的名称时,它可以是一个很好的可读性帮助 - 不确定您的代码中是否真的如此。

    我认为,通过不应用两个过滤操作 selectselectFirst,而只使用一个将两个匹配条件与 and 相结合的操作,您可以获得可读性胜利(注意,代码不是测试):

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

    【讨论】:

    • 感谢您的回复!这个“和”功能似乎正是我所追求的。你能给我寄一个包裹吗(看不到明显的地方)?是 hamcrest 还是 lambdaj?
    • 另外,“当你可以给标识符一个有意义的名字时——不确定你的代码是否真的如此。”。残酷的!显然我已经为这篇文章更改了我的对象的名称:)。再次感谢您的帮助。
    • 我正在考虑 Lambdaj 中 AndMatcher 类的静态构造函数 and
    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 2018-12-09
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多