提问者:小点点

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


给定人员列表:

class Person {
  private Integer id;
  private Integer age;
  private String name;
  private Long lat;
  private Long lont;
  private Boolean hasComputer;
...

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

我想先试着匹配所有的标准,但是如果不起作用,试着匹配这些标准中的任何一个。

我想到了一个类似的方法来做这件事,比如一个完整的文本搜索会做一个排名系统?但是我是流的新手,所以仍然在寻找如何做到这一点的解决方案。

List<Person> persons = service.getListPersons();
persons.stream().filter(p -> p.getAge.equals(age) && p.hasComputer().equals(true)).allMatch()

知道吗?谢谢!

>

  • 编辑:也许我可以创建一个谓词,例如

    谓语谓语=p-

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

    Persons.steam().allMatch(predicate).limit(5);
    Person.steam().anyMatch(predicate).limit(5);
    

  • 共1个答案

    匿名用户

    试试这个,

    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谓词。这只是完成工作的模板。

    或者,如果您有一些外部客户端传递的动态数量的谓词,您仍然可以这样做。

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