如何使用stream和optional重写代码

问题描述 投票:0回答:1

我正在尝试使用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以便它如上所述工作?

java java-stream optional
1个回答
2
投票

你可以使用嵌套的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));
© www.soinside.com 2019 - 2024. All rights reserved.