Java 8 - необязательно <CustomizedObject>получить первый элемент списка в CustomizedObject - PullRequest
4 голосов
/ 30 сентября 2019

Я не уверен, как это сделать

class Department {
    String deptName;
    List<Person> employees;
}

class Person {
    String personName;
}

Задача состоит в том, чтобы выбрать имя человека, работающего в определенном отделе. Этот отдел может быть необязательным. Вот так выглядит мой метод -

String getFirstPerson(Optional<Department> department, String defaultName) {
// TODO: 
}

Я знаю традиционный способ сделать это, но хотел бы увидеть какой-нибудь лямбда-способ Java 8 +, чтобы упростить это. Все еще новичок здесь - так что прошу прощения, если я не использую правильный формат.

У меня также есть имя по умолчанию для использования в случае, если мы не найдем это значение.

PS Я знаю, что не рекомендуется отправлять Optional в качестве параметра метода. Это не фактический код. Я просто пытаюсь упростить это.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Вы можете использовать функцию map в Optional, чтобы получить список сотрудников, а затем использовать stream, чтобы получить имя или вернуть defaultName. Даже если Optional пусто, вы получите defaultName

String getFirstPerson(Optional<Department> department, String defaultName) {

   return department.map(d->d.getEmployees().stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName));
}

Если у вас есть шанс получить null на getEmployees, вы можете использовать следующий подход

department.map(Department::getEmployees)
          .filter(Objects::nonNull)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)
1 голос
/ 01 октября 2019

Фактически в:

department.map(Department::getEmployees)
          .filter(Objects::nonNull)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)

нам не нужно проверять ненулевое значение, поскольку .map(Department::getEmployees) вернет Optional.empty(), если сотрудники равны нулю. См. Дополнительная документация . Правильный ответ будет без избыточного фильтра:

department.map(Department::getEmployees)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)

Или, альтернативно:

department.map(Department::getEmployees)
          .map(List::stream)
          .map(Stream::findFirst)
          .flatMap(Functions.identity())
          .map(Person::getPersonName)
          .orElse(defaultName);
1 голос
/ 30 сентября 2019

Упрощенный способ сделать это может быть использование emptyList для отсутствующего отдела или обнуляемый employees:

String getFirstPerson(Optional<Department> department, String defaultName) {
    return department.map(Department::getEmployees)
            .orElse(Collections.emptyList()) // get rid of this ensuring non null List
            .stream()
            .map(Person::getPersonName)
            .findFirst()
            .orElse(defaultName);
}
...