2017-02-08 6 views
2
Persons = personDao.getFileInformation(filePath) 
        .skip(1) 
        .map(this::getPerson) 
        .filter(person -> person != null) 
        .collect(Collectors.toList()); 

getFileInformation(filePath) returns Stream<String> 

после считывания строк в файле.Условный вызов метода в методе карты java 8

Я хотел бы заменить метод getPerson с getMale или getFemale метод, основанный на значении перечисления

public enum gender { 
male,female 
} 

Как это может быть достигнуто, используемые лямбда-выражения?

+0

, что делает getMale и getFemale возвращать каждый? персона? или Мужской/Женский объект? – Eugene

+1

@Eugene: Я бы интерпретировал этот вопрос, как в вашем (удаленном) ответе, однако, похоже, он не стоит усилий, если вопросник все равно ... – Holger

+0

@ Хольгер Я действительно надеялся, что это привлечет некоторое внимание , потому что я действительно хотел сказать, что используя ссылку на метод, например: 'return p.getGender() == Gender.MALE? this :: getMale: this :: getFemale; 'не компилируется. Я не вырыл все глубже, но я надеялся, что как только внимание будет там, я бы это сделал. – Eugene

ответ

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); 

Если вы просто хотите использовать метод, чтобы упростить фильтр-предикат (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; 
} 
+1

Возможно, вы захотите рассмотреть стоимость, которую она приносит, когда использовать skip(). См. Https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#skip-long- –