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

时间:2018-08-16 04:38:56

标签: filter java-8 java-stream predicate

给出人员列表:

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

我想根据一组条件(例如年龄在30到32岁之间)的计算机返回前五名。

我想先匹配所有条件,但是如果不起作用,请尝试匹配所有条件。

我想到了类似的方法,例如全文搜索对排名系统有帮助吗?但是我是Stream的新手,所以仍在寻找解决方法。

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

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

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

1 个答案:

答案 0 :(得分:3)

尝试一下

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,您仍然可以这样做。

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