如何将含嵌套if else的Java代码改写为Java 8 Optional风格
Java 8 Optional风格改写方案
适配Java 8的最终实现代码
// 第一步:优先查询入参priorityId对应的优先级名称 Optional<String> priorityName = Optional.ofNullable(id.priorityId) .flatMap(priorityId -> getPriorityInfoById(siiClient, priorityId)) .map(this::getNameBySiiPriorityInfo) .filter(name -> !name.isEmpty()); // 第一步查询为空时,走客户关联优先级降级查询 if (priorityName.isEmpty()) { priorityName = Optional.ofNullable(id.customerId) .flatMap(customerId -> getCustomerInfoByCustomerId(siiClient, customerId)) .filter(siiCustomerInfo -> siiCustomerInfo.getPriorityId() != null) .map(SiiCustomerInfo::getPriorityId) .flatMap(priorityId -> getPriorityInfoById(siiClient, priorityId)) .map(this::getNameBySiiPriorityInfo) .filter(name -> !name.isEmpty()); }
改写说明
- 消除了原代码的嵌套if结构,逻辑分层清晰,主逻辑和降级逻辑完全拆分
- 所有空指针校验都通过
Optional.ofNullable、flatMap、filter实现,替代手动!= null、isPresent()判断 - 如果你的运行环境支持Java 9及以上版本,可以进一步简化为纯链式调用,用
Optional.or()方法替代外层的空判断:
Optional<String> priorityName = Optional.ofNullable(id.priorityId) .flatMap(priorityId -> getPriorityInfoById(siiClient, priorityId)) .map(this::getNameBySiiPriorityInfo) .filter(name -> !name.isEmpty()) .or(() -> Optional.ofNullable(id.customerId) .flatMap(customerId -> getCustomerInfoByCustomerId(siiClient, customerId)) .filter(siiCustomerInfo -> siiCustomerInfo.getPriorityId() != null) .map(SiiCustomerInfo::getPriorityId) .flatMap(priorityId -> getPriorityInfoById(siiClient, priorityId)) .map(this::getNameBySiiPriorityInfo) .filter(name -> !name.isEmpty()) );
内容的提问来源于stack exchange,提问作者Sasha
相关产品推荐
相关产品推荐

