2 回答
TA贡献1829条经验 获得超7个赞
从您的问题给出的代码开始:
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
我们可以根据他们匹配的谓词数量对人员列表进行排序:
List<Person> sortedListOfPeopleByPredicateMatchCOunt =
listPersArrays
.asList(listPersons)
.stream()
.sorted(
Comparator.comparingLong(p -> predicates.stream().filter(predicate -> predicate.test(p)).count()))
// Reverse because we want higher numbers to come first.
.reversed())
.collect(Collectors.toList());
TA贡献1797条经验 获得超6个赞
只是上述答案的扩展,如果您的目标是过滤匹配尽可能多条件的集合,您可以创建一个组合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());
添加回答
举报