Hel*_*eat 2 java functional-programming filtering 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()));
Run Code Online (Sandbox Code Playgroud)
B)
SomeObject someObject = selectFirst(select(foo.getSomeParentObject().getSomeObjects(), having(on(SomeObject.class)
.getId(), equalTo(123))), having(on(SomeObject.class).getLoanTerm(), notNullValue()));
Run Code Online (Sandbox Code Playgroud)
第一个似乎更具可读性,特别是对于不熟悉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()));
Run Code Online (Sandbox Code Playgroud)