Java流匹配尽可能多的谓词

时间:2018-08-17 06:07:14

标签: java java-stream predicate

试图根据定义为谓词的某些条件过滤列表(以下仅是示例):

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,但这不太准确。

有什么主意吗?谢谢!

2 个答案:

答案 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());