列表中的Java8 StreamFilter

列表中的Java8 StreamFilter,filter,java-8,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(Perso

我有这样的想法:

   // 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);
}
//没有java8闭包/流api的公共代码(这很有效):
公共静态列表getFilteredRes_OLD(列表所有,列表名称){
List pos=new ArrayList();
(e人:全部){
for(字符串n:名称){
如果(人是女性(n).测试(e)){
位置add(e);
}
}
}
返回pos;
}
公共静态谓词isFemale(字符串测试){
返回p->p.getFirstName()!=null&&p.getFirstName().equalsIgnoreCase(测试);
}
现在,我想在Java 8中使用新的流过滤器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;
}
//JAVA 8代码(这可以工作,但仅适用于指定的筛选器值):
公共静态列表getFilteredRes_NEW(列表所有,列表名称){
返回所有.stream()
//如何将列表“名称”放入筛选方法
//我不想只测试“Lisa”,而是测试wohle“姓名”列表
.filter(Person.isFemale(“Lisa”))
.collect(Collectors.toList());
返回pos;
}
我对getFilteredRes_NEW()的问题是:

如何将“名称”列表放入筛选方法?
我不想只测试'Lisa',而是测试流中的wohle“names”-列表。

我想这里是您想要的筛选指令:

.filter(person -> names.stream().anyMatch(
                      name -> Person.isFemale(name).test(person)))
对于每个人,它测试在姓名列表中是否至少有一个姓名N,
person.isFemale(N).test(p)
返回true

如果您有一个简单的方法,它将更简单,并且创建更少的谓词实例

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(),因为它根本不测试此人是否是女性。它测试一个人是否有一个给定的名字(忽略大小写)。

我想这里是您想要的筛选指令:

.filter(person -> names.stream().anyMatch(
                      name -> Person.isFemale(name).test(person)))
对于每个人,它测试在姓名列表中是否至少有一个姓名N,
person.isFemale(N).test(p)
返回true

如果您有一个简单的方法,它将更简单,并且创建更少的谓词实例

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(),因为它根本不测试此人是否是女性。它测试一个人是否有一个给定的名字(忽略大小写)。

我想这里是您想要的筛选指令:

.filter(person -> names.stream().anyMatch(
                      name -> Person.isFemale(name).test(person)))
对于每个人,它测试在姓名列表中是否至少有一个姓名N,
person.isFemale(N).test(p)
返回true

如果您有一个简单的方法,它将更简单,并且创建更少的谓词实例

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(),因为它根本不测试此人是否是女性。它测试一个人是否有一个给定的名字(忽略大小写)。

我想这里是您想要的筛选指令:

.filter(person -> names.stream().anyMatch(
                      name -> Person.isFemale(name).test(person)))
对于每个人,它测试在姓名列表中是否至少有一个姓名N,
person.isFemale(N).test(p)
返回true

如果您有一个简单的方法,它将更简单,并且创建更少的谓词实例

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(),因为它根本不测试此人是否是女性。它测试一个人是否有一个给定的名字(忽略大小写)。

我不理解你的逻辑。
Person.female
是静态方法吗?当你调用
Person.isFemale(n).test(e)
时,你在测试什么?
Person.isFemale(n)
返回什么?filter方法接受此处使用的谓词。此注释不回答我的问题。我试图理解您的Java7代码,以了解它在Java8中的外观。getFilteredRes_OLD()使用Java8谓词,但不使用stream/filter。这两种方法都编译为java8。但是我想把_OLD()改成_NEW(),得到相同的结果。是否有办法将列表放入all.stream().filter()-方法中?请澄清。在第一个代码段中,调用
isFemale(n)
。但是紧接着发布的
isFemale()
方法不接受任何参数。所以这不需要编译。另外,是否要为列表中的每个姓名添加相同的人。isFemale(n)。test(e)为true(这是您的旧方法所做的)?我不理解您的逻辑。
Person.female
是静态方法吗?当你调用
Person.isFemale(n).test(e)
时,你在测试什么?
Person.isFemale(n)
返回什么?filter方法接受此处使用的谓词。此注释不回答我的问题。我试图理解您的Java7代码,以了解它在Java8中的外观。getFilteredRes_OLD()使用Java8谓词,但不使用stream/filter。这两种方法都编译为java8。但是我想把_OLD()改成_NEW(),得到相同的结果。是否有办法将列表放入all.stream().filter()-方法中?请澄清。在第一个代码段中,调用
isFemale(n)
。但是紧接着发布的
isFemale()
方法不接受任何参数。所以这不需要编译。另外,是否要为列表中的每个姓名添加相同的人。isFemale(n)。test(e)为true(这是您的旧方法所做的)?我不理解您的逻辑。
Person.female
是静态方法吗?当你调用
Person.isFemale(n).test(e)
时,你在测试什么?
Person.isFemale(n)
返回什么?filter方法接受此处使用的谓词。此注释不回答我的问题。我试图理解您的Java7代码,以了解它在Java8中的外观。getFilteredRes_OLD()使用Java8谓词,但不使用stream/filter。这两种方法都编译为java8。但是我想把_OLD()改成_NEW(),得到相同的结果。是否有办法将列表放入all.stream().filter()-方法中?请澄清。在第一个代码段中,调用
isFemale(n)
。但是紧接着发布的
isFemale()
方法不接受任何参数。所以这不需要编译。另外,是否要添加相同的PER