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.
对我来说,自然的解决方案是将你的? :构造保持在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.
| 归档时间: |
|
| 查看次数: |
1919 次 |
| 最近记录: |