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

3

考虑到一个人(Person)列表:

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

有什么想法吗?谢谢!

  • 编辑:

    也许我可以创建一个谓词,例如

    Predicate predicate = p -> p.getAge() < 30 && e.name.startsWith("A");

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

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

否则,我仍然可以为每个条件设置循环和大量的条件,但我相信应该有更好的方法来处理它。 - Andrew
Persons 是什么?它是 Person 的列表吗? - Rishikesh Dhokare
是的,抱歉让您感到困惑。List<Person> persons。 - Andrew
1个回答

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

请注意,您可以根据需要添加额外的筛选器谓词。 这只是一个模板,以完成您的工作。
或者,如果您有一些动态数量的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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接