如何优雅重构Optional判空逻辑?空值执行操作,非空获取对象
重构方案
当然可以重构这段代码,利用Optional的链式调用特性,让代码更简洁紧凑,同时保持可读性:
方案一:链式调用+lambda内处理业务逻辑
return productVersionMongoService.findById(crmProductId) .map(ProductVersion::getProductId) .flatMap(productMongoService::findById) .map(product -> { // 这里编写拿到product后的业务逻辑,最终返回需要的Set结果 // 示例:return buildResultSet(product); }) .orElseGet(() -> { log.warn("未找到对应产品,crmProductId: {}", crmProductId); return Collections.emptySet(); });
方案二:抽离业务逻辑为单独方法(更适合复杂业务)
如果后续业务逻辑代码较多,建议把逻辑抽成独立方法,让代码结构更清晰:
// 抽离的业务方法 private Set<YourResultType> processProductBusiness(Product product) { // 实现具体业务逻辑,返回最终需要的Set } // 主流程代码 return productVersionMongoService.findById(crmProductId) .map(ProductVersion::getProductId) .flatMap(productMongoService::findById) .map(this::processProductBusiness) .orElseGet(() -> { log.warn("未找到对应产品,crmProductId: {}", crmProductId); return Collections.emptySet(); });
重构优势
- 去掉了冗余的
if-else判断和单独的product变量声明,代码更紧凑 - 保持Optional的链式调用风格,符合Java 8+函数式编程的设计思路
- 空值处理(日志+返回空集合)与非空业务逻辑清晰分离,可读性更强
内容的提问来源于stack exchange,提问作者Aliaksei
相关产品推荐
相关产品推荐

