java 8 可选替换 return null

标签 java java-8 option-type

我正在将代码重构为 Java 8,我想用 Optional 替换 null 检查。

public Employee findEmployeeById(String id) {
    List<Employee> empList = .. //some db query
    return (empList.isEmpty() ? null : empList.get(0));
}

Optional.ofNullable(empList.get(0)) 将无法正常工作,因为它会抛出 IndexOutofBoundException

或者我应该理想地用 Optional.empty() 替换 null 吗?

最佳答案

正如@Jesper 在评论中已经提到的,您必须检查列表是否为空,然后返回一个空的 Optional。 .

public Optional<Employee> findEmployeeById(String id) {
    List<Employee> empList = .. //some db query
    return empList.isEmpty() ? Optional.empty() : Optional.of(empList.get(0));
}

Optional是潜在 null 的包装器允许您避免显式检查 null 的值当你使用它时。

看看 Optional documentation查看它提供的功能。

例如,您可以获得员工姓名或“未知”(如果不存在),而无需检查 null :

Optional<Employee> emp = findEmployeeById(id);
String name = emp.map(Employee::getName).orElse("unknown");

您可以阅读 this post about Uses for Optional看看你使用 Optional 是否有意义.

关于java 8 可选替换 return null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43951727/

相关文章:

ios - Swift 可选参数函数

rust - 是否可以在不使用匹配的情况下将 Option<Result<T, E>> 转换为 Result<Option<T>, E>?

java - 发生解析错误时抛出适当的异常?

java - 将图像大小调整为定义的尺寸并将未使用的区域涂成红色?

lambda - Java-8 如何重用 lambda 表达式

java - 在这种情况下扩展 List<E> 有用吗?

ios - Swift Action 扩展 NSString 错误?

java - JVM-详细: Formatting out put

java - 多个应用程序在同一 JVM 上运行时的 JVM 内存分析

java - 自定义排序方式是A排在a之前,B排在b之前