Java 避免空检查条件运算符样板的最佳实践

Java 避免空检查条件运算符样板的最佳实践,java,java-8,optional,Java,Java 8,Optional,当无法使用空对象时,替换条件运算符空检查样板的最佳实践是什么: public String getEmployeeName() { return employee == null ? null : employee.getName(); } Java8或任何实用程序库中是否有类似的内容 public String getEmployeeName() { return nullable(employee, employee -> employee.getName()); }

当无法使用空对象时,替换条件运算符空检查样板的最佳实践是什么:

public String getEmployeeName() {
    return employee == null ? null : employee.getName();
}
Java8或任何实用程序库中是否有类似的内容

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);
}
公共字符串getEmployeeName(){
返回可为空(employee,employee->employee.getName());
}
私有R可空(T可空,函数doIfNotNull){
return nullable==null?null:doIfNotNull.apply(nullable);
}
Java8有了新的类,例如

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();
}

您可以将代码重构为:

public String getEmployeeName() {
    return Optional.ofNullable(employee).map(Employee::getName).orElse(null);
}
从给定员工中创建一个
Optional
值:如果该值为
null
,则返回空的
Optional
;否则,将返回包含该员工的
可选
。然后,使用将此
可选的
映射到员工的姓名,如果
可选的
为非空,则返回一个新的
可选的
,并应用给定的映射器,如果
可选的
为空,则返回一个空的
可选的
。最后,返回员工的姓名,或者
null
可选值
为空


话虽如此,我认为将此代码置于
null
-检查和条件运算符之上没有任何附加值:它可能会有更好的性能,也可能更易于阅读。

我发现
return employee==null?null:employee.getName()
是最具可读性的,因此它可能是更好的解决方案,而不仅仅是使代码过于复杂。它完成了任务,而且没有任何问题——因此不妨使用它。这就是条件运算符的作用


通常,当试图决定使用哪种编程模式时,最好使用可读性最好、代码的未来维护人员最容易理解的模式。

我发现
return employee==null?null:employee.getName()
是最具可读性的,因此它可能是更好的解决方案,而不仅仅是使代码过于复杂。它完成了任务,而且没有任何问题——因此不妨使用它。这就是条件运算符的作用。我也认为这是最清楚、最简单的解决方案,请给出一个答案,我会接受。是的,没错。但是我的意思是当你不能重构空值的源代码时,
Optional
的问题是它不能保证它的输入是非空的。下面是一个示例,它显示为
Optional.of
函数提供空值将生成空指针运行时错误,就像不使用
Optional
@NateMara一样,如果允许该值在该点为空,请使用。如果值不允许为null,那么您应该得到NPE。这正是Stuart Marks在这里讨论的那种“可选滥用”:这是我正在寻找的一个,谢谢,但我认为只保留原来的条件运算符更易读、更简单。
public String getEmployeeName() {
    return Optional.ofNullable(employee).map(Employee::getName).orElse(null);
}