Java流匹配尽可能多的谓词

Java流匹配尽可能多的谓词,java,java-stream,predicate,Java,Java Stream,Predicate,根据一些定义为谓词的标准筛选列表(以下仅为示例): Predicate agePredicate=p->p.agep.dateOfBirthp.name.startWith(“a”); 列表谓词=Arrays.asList(agePredicate、dobPredicate、namePredicate); ListShortListPersons=listPersArrays.asList(listPersons).stream().filter(p->predicates.stream().a

根据一些定义为谓词的标准筛选列表(以下仅为示例):

Predicate agePredicate=p->p.age<30;
谓词dobPredicate=p->p.dateOfBirth<1980;
谓词名称Predicate=p->p.name.startWith(“a”);
列表谓词=Arrays.asList(agePredicate、dobPredicate、namePredicate);
ListShortListPersons=listPersArrays.asList(listPersons).stream().filter(p->predicates.stream().allMatch(f->f.test(p)).limit(10).collect(Collectors.toList());
在这种情况下,我找不到任何人/足够多的人,我如何才能得到一份符合尽可能多标准的人的名单——一种排名

我的另一个选择是再次调用与上面相同的函数,但使用anyMatch,但它不会非常准确


有什么想法吗?谢谢

从问题中给出的代码开始:

List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
List 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());
List sortedListOfPeopleByPredicateMatchCOunt=
ListPersArray
.asList(列表人员)
.stream()
.分类(
Comparator.comparingLong(p->predicates.stream().filter(predicate->predicate.test(p)).count())
//相反,因为我们希望更高的数字排在第一位。
.reversed())
.collect(Collectors.toList());

从问题中给出的代码开始:

List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);
List 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());
List sortedListOfPeopleByPredicateMatchCOunt=
ListPersArray
.asList(列表人员)
.stream()
.分类(
Comparator.comparingLong(p->predicates.stream().filter(predicate->predicate.test(p)).count())
//相反,因为我们希望更高的数字排在第一位。
.reversed())
.collect(Collectors.toList());

只是上述答案的扩展,如果您的目标是筛选与尽可能多的条件匹配的集合,则可以创建一个复合的
谓词
,然后将其用于筛选

给定谓词列表:

List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);

如果您的目标是筛选与尽可能多的条件匹配的集合,那么您可以创建一个复合
谓词
,然后使用它进行筛选

给定谓词列表:

List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);

太神了这正是我的想法,但我不知道如何使用谓词。太棒了!这正是我的想法,但我不知道如何使用谓词。没有直接回答问题,但是+1表示谓词上的
reduce
。您可以执行类似的操作,将谓词缩减为给定的
Person
值,然后按给定的
函数进行排序。
不会直接回答问题,但是+1表示谓词上的
reduce
。您可以执行类似的操作,将谓词减少为给定的
Person
值,然后按给定的
函数进行排序。