猿问

Java 流匹配尽可能多的谓词

希望根据定义为 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 代替,但它不会很准确。


任何的想法?谢谢!


桃花长相依
浏览 148回答 2
2回答

千巷猫影

从您的问题给出的代码开始:List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);我们可以根据他们匹配的谓词数量对人员列表进行排序:List<Person> sortedListOfPeopleByPredicateMatchCOunt =&nbsp;&nbsp; listPersArrays&nbsp; &nbsp; .asList(listPersons)&nbsp; &nbsp; .stream()&nbsp; &nbsp; .sorted(&nbsp; &nbsp; &nbsp; Comparator.comparingLong(p -> predicates.stream().filter(predicate -> predicate.test(p)).count()))&nbsp; &nbsp; &nbsp; &nbsp;// Reverse because we want higher numbers to come first.&nbsp; &nbsp; &nbsp; &nbsp;.reversed())&nbsp; &nbsp; .collect(Collectors.toList());

互换的青春

只是上述答案的扩展,如果您的目标是过滤匹配尽可能多条件的集合,您可以创建一个组合Predicate<Person>,然后将其用于过滤。鉴于您的谓词列表:List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);复合谓词可以这样创建:Predicate<Person> compositPredicate = predicates.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(predicate -> false, Predicate::or);注意:由于归约操作需要一个标识值,并且如果任何一个谓词结果为or ,Predicate<>类的操作不会应用任何进一步的谓词true,我已将其用作predicate -> false标识值。现在,过滤集合变得更容易和更干净:List<Person> shortListPersons = persons.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.filter(compositPredicate)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toList());
随时随地看视频慕课网APP

相关分类

Java
我要回答