java 8可选替换返回null

cod*_*r25 5 java optional java-8

我正在重构Java 8的代码,我想用Optional替换null检查.

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

Optional.ofNullable(empList.get(0)) 什么时候不会起作用 IndexOutofBoundException

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

Flo*_*ern 10

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

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

An Optional是一个潜在null值的包装器,允许您null在使用它时避免显式检查.

查看可选文档以查看它提供的功能.

例如,如果不存在,您可以获得员工的姓名或"未知",而不检查null:

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

你可以阅读这篇关于Uses for Optional的帖子,看看你是否有意义使用Optional.

  • @BilboBaggins 如果该值可以为 null,那么是的,您必须使用 `Optional.ofNullable()`。 (2认同)

Ole*_*.V. 5

对我来说,自然的解决方案是将你的? :构造保持在Floern的答案中.但是,如果你想摆脱它,那么没有它也有一个优雅的解决方案:

public Optional<Employee> findEmployeeById(String id) {
    List<Employee> empList = .. //some db query
    return empList.stream().findFirst();
}
Run Code Online (Sandbox Code Playgroud)

这给你你想要的东西因为findFirst()返回一个Optional.如果你不关心你得到哪个元素 - 或者你知道从来没有多于一个 - 你可以选择使用findAny()它,它也会返回一个Optional.

  • 太好了!你甚至不需要`empList`本地,所以这可以简化为`return someDbQuery().stream().findFirst()`. (2认同)