首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java流过滤器匹配多个条件谓词

Java流过滤器匹配多个条件谓词
EN

Stack Overflow用户
提问于 2018-08-16 04:38:56
回答 1查看 3.9K关注 0票数 3

给出一份人名单:

代码语言:javascript
复制
class Person {
  private Integer id;
  private Integer age;
  private String name;
  private Long lat;
  private Long lont;
  private Boolean hasComputer;
...

我想给出一套标准,比如年龄在30到32岁之间,拥有一台电脑的前五名。

我想尝试首先匹配所有的标准,但如果它不起作用,试着匹配其中任何一个。

我有一个类似的方法来做它,如一个完整的文本搜索将与一个排名系统?但我是新的流,所以仍然在寻找解决方案,如何去做。

代码语言:javascript
复制
List<Person> persons = service.getListPersons();
persons.stream().filter(p -> p.getAge.equals(age) && p.hasComputer().equals(true)).allMatch()

有什么想法吗?谢谢!

  • 编辑:也许我可以创建一个谓词,例如 谓词=p -> p.getAge() < 30 && e.name.startsWith("A");

并尝试首先匹配所有的标准,如果不可能,尝试匹配任何:

代码语言:javascript
复制
Persons.steam().allMatch(predicate).limit(5);
Person.steam().anyMatch(predicate).limit(5);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 05:20:45

试试这个,

代码语言:javascript
复制
List<Person> filteredPeople = persons.stream()
    .filter(p -> p.getAge() > 30)
    .filter(p -> p.getAge() < 32)
    .filter(p -> p.getHasComputer())
    .limit(5).collect(Collectors.toList());

注意,您可以根据需要添加额外的filter谓词。这只是一个模板来完成你的工作。

否则,如果您有一些经过某个外部客户端的动态Predicates数,您仍然可以这样做。

代码语言:javascript
复制
Predicate<Person> ageLowerBoundPredicate = p -> p.getAge() > 30;
Predicate<Person> ageUpperBoundPredicate = p -> p.getAge() < 32;
Predicate<Person> hasComputerPred = p -> p.getHasComputer();
List<Predicate<Person>> predicates = Arrays.asList(ageLowerBoundPredicate, ageUpperBoundPredicate,
                hasComputerPred);
List<Person> filteredPeople = persons.stream()
        .filter(p -> predicates.stream().allMatch(f -> f.test(p)))
        .limit(5).collect(Collectors.toList());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51869685

复制
相关文章

相似问题

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