初始化和链谓词
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;
我有一个人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;