【问题标题】:Best practice to avoid null-check conditional operator boilerplate避免空检查条件运算符样板的最佳实践
【发布时间】:2015-12-05 04:24:26
【问题描述】:

当无法使用空对象时,最好的做法是替换条件运算符空检查样板,如下所示:

public String getEmployeeName() {
    return employee == null ? null : employee.getName();
}

Java 8 或任何实用程序库中是否有类似下面的内容?

public String getEmployeeName() {
    return nullable(employee, employee -> employee.getName());
}

private <T, R> R nullable(T nullable, Function<T, R> doIfNotNull) {
    return nullable == null ? null : doIfNotNull.apply(nullable);
}

【问题讨论】:

  • 我发现return employee == null ? null : employee.getName(); 是最易读的,所以也许它是更好的解决方案,而不是仅仅让你的代码过于复杂。它完成了工作,并且没有任何问题 - 所以不妨使用它。这就是条件运算符的用途。
  • 我也认为这是最清晰和最简单的解决方案,请为此创建一个答案,我会接受。

标签: java java-8 optional


【解决方案1】:

我发现return employee == null ? null : employee.getName(); 是最易读的,所以也许它是更好的解决方案,而不是仅仅让你的代码过于复杂。它完成了工作,并且没有任何问题 - 所以不妨使用它。这就是条件运算符的用途。

通常在尝试决定使用哪种编程模式时,最好使用最易读且代码的未来维护者最容易理解的模式。

【讨论】:

    【解决方案2】:

    您可以将代码重构为:

    public String getEmployeeName() {
        return Optional.ofNullable(employee).map(Employee::getName).orElse(null);
    }
    

    ofNullable 从给定的员工中创建一个Optional 值:如果是null,则返回空的Optional;否则返回包含员工的Optional。然后,这个Optional 使用map 映射到员工的姓名,如果Optional 不为空,则返回一个新的Optional 并应用给定的映射器,如果Optional 则返回一个空的Optional是空的。最后orElse返回员工姓名或者nullOptional为空。

    话虽如此,我认为这段代码对null-check 和条件运算符没有任何附加价值:它可能会有更好的性能,也可能更容易阅读。

    【讨论】:

    • 我正在寻找这个,谢谢,但我认为保留原来的条件运算符更易读也更简单。
    【解决方案3】:

    Java 8 有新的Optional 类,例如

    private Optional<Employee> employee = Optional.empty();
    
    public Optional<Employee> getEmployee() {
        return this.employee;
    }
    public void setEmployee(Employee employee) {
        this.employee = Optional.of(employee); // null not allowed
    }
    public void removeEmployee() {
        this.employee = Optional.empty();
    }
    

    employee 永远不会是 null,但可能是“空的”。

    getEmployeeName() 方法可以通过两种方式实现:

    // Returning Optional (never null)
    public Optional<String> getEmployeeName() {
        return this.employee.map(Employee::getName);
    }
    
    // Standard getter (may return null)
    public String getEmployeeName() {
        return this.employee.map(Employee::getName).orElse(null);
    }
    

    【讨论】:

    • 是的,没错。但我的意思是当你无法重构 null 值的来源时。
    • Optional 的问题是它不能保证它的输入是非空的。这是一个示例,ideone.com/8b4w6A,它表明向Optional.of 函数提供空值将产生空指针运行时错误,就像不使用Optional 一样。
    • @NateMara 如果此时允许值为空,请使用Optional.ofNullable(x)。如果 value not 允许为 null,那么你应该得到 NPE。
    • 这正是 Stuart Marks 在这里讨论的那种“可选滥用”:stackoverflow.com/questions/23454952/uses-for-java8-optional/…
    猜你喜欢
    • 2013-06-13
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多