初始化和链接谓词

问题描述

我的人形如下:

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

我必须在不知道过滤条件的情况下过滤人员名单。我将在运行时通过一些布尔变量获取这些信息

boolean isMale = false;
boolean isDeveloper = false;
boolean hasMaster = true;

我想使用谓词并根据布尔值将它们链接(如果需要)。仅应使用true值来创建过滤谓词,即,如果所有均为false,则根本不应该过滤列表。目前,我正在这样做

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

上面有一个问题:仅在满足条件的第一个条件下起作用,并且我首先将谓词初始化为null。否则,我将获得NPE或“变量过滤器可能尚未初始化”。我调查了谓词类,希望找到一些像Predicate.TRUE这样的静态值,它可以接受所有项或剂量过滤器,但是没有运气。我想避免这种情况:

if(isMale && filter != null)

我该怎么办?

Predicate<Person> filter = ???;

解决方法

您可以使用

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