我正在使用这个逻辑,如果没有找到雇员,则尝试返回new Employee()
。
但是,当request.getId()
是null
时,它抛出异常,我等待它执行orElse()
部分,但是它没有,那么,我应该使用另一个可选方法,例如orElseGet()
或ifPresentOrElse()
吗?
如何以智能方式解决此问题?
Employee employee = employeeRepository.findById(request.getId())
.orElse(new Employee());
***更新:***如果使用Optional
不是一个好主意,我考虑使用以下方法:
Employee employee = new Employee();
if (id != null) {
employee = employeeRepository.findById(id)
.orElse(new Employee());
}
有什么想法吗?
3条答案
按热度按时间tzdcorbm1#
正如在注解中提到的,
Optional
在这种情况下不做任何事情。要解决这个问题,你需要自己处理null
的值。你可以让request.getId()
自己返回一个Optional
(因为它可以是null
)。现在,您可以使用
flatMap()
运算符链接这些Optional
。现在,您可以重构代码以:
svgewumm2#
避免使用Optional来隐藏空检查
使用
Optional
来隐藏 * null检查 * -是反模式。隐式 * 空值检查 * 没有什么错,例如
if (something == null)
和Optional
上的更多不是设计用于执行 * 空值检查 。以下是Java和OpenJDK开发人员Stuart Marks对answer的引用:
Optional的主要用途如下:(幻灯片36)
Optional
旨在为库方法返回类型提供一种有限机制,在这种情况下,明确需要表示“无结果",并且在这种情况下,使用null
非常可能导致错误。从
Optional
链接方法的能力无疑是非常酷的,在某些情况下,它减少了条件逻辑的混乱。但通常情况下,这是行不通的。一个典型的代码味道是,它不是使用方法链接处理从某个方法返回的Optional,而是从可空的东西创建Optional。以便链接方法和避免条件。( 重点是我 *)
从上面的引文中可以清楚地看到,
Optional
是在JDK中引入的,为返回类型提供了一个有限的机制。任何其他情况,如使用可选字段,将其存储到集合中,创建可选字段来替换空值检查或/和以便在其上链接方法,都被认为是Optional
的滥用。再看看Stuart Marks的另一个答案:Should Optional.ofNullable() be used for null check?
也就是说,当请求对象中的
id
可以是null
时,通过id
检索employee的更简洁的方法将如下:如果
new Employee()
在代码中出现两次让fill不舒服,那么你可以这样重新实现它:9q78igpj3#
如何处理
request.getId()
的空值并避免陷入异常?假设
employeeRepository#findById
传回Optional<Employee>
,请使用下列其中一项:第一个