java - 如何使用流和可选重写代码

标签 java java-stream option-type

我正在尝试使用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 使其按上述方式工作?

最佳答案

您可以使用嵌套的 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));

关于java - 如何使用流和可选重写代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55417858/

相关文章:

java - Java8中如何进行分组和缩减

java - 在 optionals 上使用 optionals 的简洁方法 - Java?

java - SQL嵌套异常

java - 内存泄漏 : Garbage-Collection Root

java - iPhone Java 字符串代码到对象 C

function - 你如何在 swift "hashable"中制作字符串选项?

c++ - 使用 ? 返回可选值: operator

java - quartz 调度程序的每个表表示什么?

Java 8 Streams 中间操作会产生新的流吗?

Java 8 Streams : multiple filters vs. 复杂情况