首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java流匹配尽可能多的谓词

Java流匹配尽可能多的谓词
EN

Stack Overflow用户
提问于 2018-08-17 06:07:13
回答 2查看 173关注 0票数 0

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

代码语言:javascript
复制
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,但是它不会非常准确。

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-17 06:12:29

从您的问题中提供的代码开始:

代码语言:javascript
复制
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);

我们可以根据匹配的谓词数对人员列表进行排序:

代码语言:javascript
复制
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());
票数 3
EN

Stack Overflow用户

发布于 2018-08-17 07:14:10

只是对上述答案的扩展,如果您的目标是筛选匹配尽可能多的条件的集合,您可以创建一个复合Predicate<Person>,然后使用它进行筛选。

给出谓词列表:

代码语言:javascript
复制
List<Predicate<Person>> predicates = Arrays.asList(agePredicate, dobPredicate, namePredicate);

可以像这样创建复合谓词:

代码语言:javascript
复制
Predicate<Person> compositPredicate = predicates.stream()
                .reduce(predicate -> false, Predicate::or);

注意:由于约简操作需要一个标识值,而如果任何一个谓词最终证明是or,则Predicate<>类的predicate -> false操作不会应用任何进一步的谓词,因此我使用了predicate -> false作为标识值。

现在,过滤集合变得更容易和更干净了:

代码语言:javascript
复制
List<Person> shortListPersons = persons.stream()
                                       .filter(compositPredicate)
                                       .collect(Collectors.toList());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51889304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档