Как переписать код, используя поток и необязательно - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь переписать код с вложенными условиями, используя Optional и Stream. Вот как он выглядел:

if (transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION") != null) {
    editObj = (EmployeeWorkstation) transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION");
} else {
    if (editObj != null) {
        editObj = editObj.getEditInstance(transaction);
    } else {
        editObj = HOME.newEmployeeWorkstation(compId);
    }
}

Я пытался переписать так:

editObj =
    ofNullable(
        (EmployeeWorkstation) transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION"))
        .orElse(
            editObj != null
                ? editObj.getEditInstance(transaction)
                : HOME.newEmployeeWorkstation(compId));

И это прекрасно работает, но мой наставник сказал, что это можно упростить

тогда я попробовал так:

editObj =
    Optional.ofNullable(
        (EmployeeWorkstation) transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION"))
            .map(obj -> obj.getEditInstance(transaction))
            .orElse(HOME.newEmployeeWorkstation(compId));

Я понимаю, что мой .map () не работает, как описано выше в первых версиях. Как я могу переписать .map, чтобы он работал как описано выше?

1 Ответ

2 голосов
/ 29 марта 2019

Вы можете использовать вложенные Optional:

EmployeeWorkstation edit = Optional.ofNullable((EmployeeWorkstation) transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION"))
        .orElseGet(() -> Optional.ofNullable(editObj)
                .map(e -> e.getEditInstance(transaction))
                .orElseGet(() -> HOME.newEmployeeWorkstation(compId)));

Если вы используете Java 9 или выше, вы можете использовать Optional.or():

EmployeeWorkstation edit = Optional.ofNullable((EmployeeWorkstation) transaction.getObjectByName("EDIT_EMPLOYEE_WORKSTATION"))
        .or(() -> Optional.ofNullable(editObj).map(edit -> edit.getEditInstance(transaction)))
        .orElseGet(() -> HOME.newEmployeeWorkstation(compId));
...