Persons = personDao.getFileInformation(filePath)
.skip(1)
.map(this::getPerson)
.filter(person -> person != null)
.collect(Collectors.toList());
getFileInformation(filePath) returns Stream<String>
读取文件中的行后。
我想根据枚举值
将 getMale 或 getFemale 方法替换为getPerson方法public enum gender {
male,female
}
如何使用lambda表达式实现这一目标?
答案 0 :(得分:3)
如果您只想按性别进行过滤(假设有Person.getGender
之类的访问者),那么您只需要添加filter
:
List<Person> malePeople;
malePeople = personDao.getFileInformation(filePath)
.skip(1)
.map(this::getPerson)
.filter(Objects::nonNull)
.filter(p -> p.getGender() == gender.male) // or gender.female
.collect(Collectors.toList());
如果您想将结果分组,以下内容将对您有所帮助:
Map<gender, List<Person>> peopleByGender;
peopleByGender = personDao.getFileInformation(filePath)
.skip(1)
.map(this::getPerson)
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(Person::getGender));
现在可以通过以下方式访问所有女性:
List<Person> femalePeople = peopleByGender.get(gender.female);
和男性的:
List<Person> malePeople = peopleByGender.get(gender.male);
如果您只是想使用方法来简化filter-predicate(p -> p.getGender() == gender.male
),那么您可以使用以下方法之一:
.filter(this::getMale) // or: YourClass::getMale for a static method
其中this::getMale
指的是以下方法:
boolean getMale(Person p) {
return p.getGender() == gender.male;
}
或
.filter(getMale())
其中getMale()
指的是以下方法:
Predicate<Person> getMale() {
return p -> p.getGender() == gender.male;
}