列表中的Java 8流过滤器

时间:2014-08-27 14:35:07

标签: filter java-8

我有这样的事情:

   // 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。

1 个答案:

答案 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(),因为如果这个人是女性,它根本不会进行测试。它测试一个人是否有一个给定的名字(忽略该案例)。