问题描述
我的人形如下:
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;