在map方法java 8中调用条件方法

时间:2017-02-08 04:18:13

标签: java-8 java-stream

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表达式实现这一目标?

1 个答案:

答案 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;
}