亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 流匹配盡可能多的謂詞

Java 流匹配盡可能多的謂詞

桃花長相依 2021-07-27 21:12:24
希望根據定義為 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 回答

?
千巷貓影

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


查看完整回答
反對 回復 2021-07-29
?
互換的青春

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


查看完整回答
反對 回復 2021-07-29
  • 2 回答
  • 0 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號