试图根据定义为谓词的某些条件过滤列表(以下仅是示例):
Predicate<Person> agePredicate = p -> p.age < 30;
Predicate<Person> dobPredicate = p -> p.dateOfBirth < 1980;
Predicate<Person> namePredicate = p -> p.name.startWith("a");
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
List<Person> shortListPersons = listPersArrays.asList(listPersons).stream().filter(p -> predicates.stream().allMatch(f -> f.test(p))).limit(10).collect(Collectors.toList());
在这种情况下,我找不到任何人/足够多的人,我怎么能找到符合尽可能多条件的人的列表-一种排名。
我的另一种选择是再次调用与上述相同的函数,但改用anyMatch,但这不太准确。
有什么主意吗?谢谢!
答案 0 :(得分:3)
从问题中给出的代码开始:
addMethod
我们可以根据匹配的谓词数量对人员列表进行排序:
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
答案 1 :(得分:1)
只是上述答案的扩展,如果您的目标是过滤与尽可能多的条件匹配的集合,则可以创建复合Predicate<Person>
,然后将其用于过滤。
给出您的谓词列表:
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
可以这样创建复合谓词:
Predicate<Person> compositPredicate = predicates.stream()
.reduce(predicate -> false, Predicate::or);
注意:由于归约运算需要一个标识值和
or
如果Predicate<>
类的操作不应用任何其他谓词,则 任何一个谓词都是true
,我用predicate -> false
作为 身份值。
现在,过滤集合变得更加轻松和整洁:
List<Person> shortListPersons = persons.stream()
.filter(compositPredicate)
.collect(Collectors.toList());