4 回答
TA贡献1725条经验 获得超7个赞
Optional
in背后的原因findById
是它避免返回null
.
另一方面,空集合可以安全地迭代和处理,因此没有.throwIfEmpty()
内置的特殊机制。空集合本质上本身就是一个Optional。它不为 null,并且可能包含也可能不包含元素。
如果在您的业务逻辑中没有结果意味着错误,那么就由您来处理它。
TA贡献1843条经验 获得超7个赞
您可以流式传输列表,获取Optional
withfindAny
并映射回列表(如果结果非空):
items.stream().findAny().map((e) -> items).orElseThrow(NotFoundException::new);
但您应该考虑这是否真的需要导致异常。作为搜索功能的消费者,我的期望将是一个空结果,没有任何元素符合我的标准。
TA贡献1806条经验 获得超5个赞
解决方案可能是封装调用的实用函数findAll。
public class MyItemNotFoundException ... {
public static <T> List<T> requireNotEmpty(List<T> items) throws MyItemNotFoundException {
if (items.isEmpty()) {
throw new MyItemNotFoundException();
}
return items;
}
}
@GetMapping("/items")
List<MyItem> all() {
return MyItemNotFoundException.requireNotEmpty(repository.findAll());
}
将函数放在 MyItemNotFoundException 中可读性不太好。更好的名字仍然感觉不自然:
return MyItemNotFoundException.whenEmpty(repository.findAll());
但是您会找到一个位置,也许在某个基类/接口中。
(在某系统中,存储库 findAll 可能返回 null(非常难看),并且使用这样的包装函数也可以处理。)
添加回答
举报