初始化和链谓词

Initalize and chain predicate

我有一个人class如下:

class Person {
       String sex;
       boolean mastersDegree;
       String position;
       //some more fields
       //getters, setters, const. toString ..
    }

我必须在事先不知道过滤条件的情况下过滤人员列表。我会在 运行 时间通过一些布尔变量

得到那些
boolean isMale = false;
boolean isDeveloper = false;
boolean hasMaster = true;

我想使用谓词并在需要时根据布尔值将它们链接起来。只应使用真值来创建过滤谓词,即如果所有值均为假,则根本不应过滤列表。现在我是这样做的

List<Person> persons = ...

Predicate<Person> filter = null;

if (isMale)
    filter = x -> x.getSex().equals("M");
if (isDeveloper)
    filter = filter.and(x -> x.getPosition().equals("DEV"));
if (hasMaster)
   filter = filter.and(Person::hasAMastersDegree);

persons.stream().filter(filter).forEach(System.out::println);

上面有一个问题:只有满足第一个 if 条件并且我首先用 null 初始化谓词时它才有效。否则我会得到一个 NPE 或“变量过滤器可能尚未初始化”。我研究了谓词 class,希望找到一些像 Predicate.TRUE 这样的静态值,它完全接受每个项目或 dosent 过滤器,但没有运气。如果可能的话,我想避免这种情况:

if(isMale && filter != null)

我该怎么做?

Predicate<Person> filter = ???;

你可以用

初始化它
Predicate<Person> filter = p -> true;