列表中的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