我有这样的事情:
// common code without java8-closures/stream-api (this works):
public static List<Person> getFilteredRes_OLD(List<Person>all, List<String> names){
List<Person> pos = new ArrayList<>();
for(Person e: all){
for(String n: names){
if(Person.isFemale(n).test(e)){
pos.add(e);
}
}
}
return pos;
}
public static Predicate<Person> isFemale(String test) {
return p -> p.getFirstName()!=null && p.getFirstName().equalsIgnoreCase(test);
}
现在,我想在Java 8中使用新的Stream-filter API:
// JAVA 8 code (this works, but only for a specified filter-value):
public static List<Person> getFilteredRes_NEW(List<Person>all, List<String> names){
return all.stream()
// how can I put the list 'names" into the filter-Method
// I do not want to test only for 'Lisa' but for the wohle "names"-list
.filter( Person.isFemale("Lisa") )
.collect(Collectors.<Person>toList());
return pos;
}
我对getFilteredRes_NEW()的提问是:
如何列出&#39;名称&#34;进入过滤器 - 方法? 我不想只为Lisa&#39;测试但对于流中的名字&#34; -list。
答案 0 :(得分:3)
我认为,这是您想要的过滤器说明:
.filter(person -> names.stream().anyMatch(
name -> Person.isFemale(name).test(person)))
对于每个人,它会测试Person.isFemale(N).test(P)
返回true的名称列表中是否至少有一个名称N.
如果你只是一个方法
,它会更简单,并创建更少的Predicate实例public boolean isFemale(Person p, String name) {
return p.getFirstName() != null && p.getFirstName().equalsIgnoreCase(test);
}
代码将成为
.filter(person -> names.stream().anyMatch(name -> isFemale(person, name)))
你还应该重命名isFemale(),因为如果这个人是女性,它根本不会进行测试。它测试一个人是否有一个给定的名字(忽略该案例)。