我正在学习LambdaJ,每次我需要完成一个任务时,我必须检查现有的示例并修改它们,以便使用LambdaJ。
我已经开始使用了,但是我觉得我遗漏了一些东西,我想问你。
我不清楚使用having
方法。我不知道它是怎么工作的,也不知道怎么用。
我已经调试,反编译并阅读了它的文档,但我没有找到lambda的"思维方式"。
having
javadoc说:
static HasArgumentWithValueorg.hamcrest.Matcher匹配器
创建一个hamcrest匹配器如果给定参数的值满足条件由传递的匹配器定义。
我在这样的例子中使用了having
:
List<User> result = filter(having(on(User.class).getAge(), greaterThan(20)), list);
我理解having
对一个参数应用了一个harmcrest匹配器,并在整个列表中重复。
但我的问题是如何工作?如何用函数的方式来考虑?
您的代码的描述可以像这样:
the function filter take each user from list and
apply it over function having
that retrieved the age and compare with value of 20.
可以写成
private List<User> filter(List<User> users) {
final List<User> filtered = new ArrayList<>();
for(User user : users) {
if(having(user.getAge(),greaterThan(20)) {
filtered.add(user);
}
}
return filtered;
}
private boolean having(Integer age, org.hamcrest.Matcher<Integer> matcher) {
return matcher.matcher(age);
}
换句话说,函数有两个参数,一个值和匹配器,并根据值计算匹配器。值参数是通过函数过滤器传递的,它期望结果为布尔值。