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());
添加回答
舉報