如何修改代码使表格第6列显示任一Provider的BusinessUnit?
解决StringBuilder中三元运算符OR报错及多Provider取非空BusinessUnit问题
问题分析
你遇到的错误本质是:在StringBuilder拼接时,错误地用OR运算符(||)组合对象判断,导致三元运算符的条件逻辑不严谨,甚至触发语法或空指针错误。核心需求是按优先级取Provider1、Provider2、Provider3中第一个非空且BusinessUnit有效的值。
解决方案
方案1:嵌套三元运算符(兼容所有Java版本)
通过嵌套三元运算符实现顺序优先级判断,每一步都验证Provider和BusinessUnit的有效性:
// 提取逻辑到单独变量,避免StringBuilder中表达式过于复杂 String targetBusinessUnit = // 先判断Provider1是否有效 (provider1 != null && provider1.getBusinessUnit() != null && !provider1.getBusinessUnit().trim().isEmpty()) ? provider1.getBusinessUnit() // Provider1无效则判断Provider2 : (provider2 != null && provider2.getBusinessUnit() != null && !provider2.getBusinessUnit().trim().isEmpty()) ? provider2.getBusinessUnit() // 前两个都无效则判断Provider3 : (provider3 != null && provider3.getBusinessUnit() != null && !provider3.getBusinessUnit().trim().isEmpty()) ? provider3.getBusinessUnit() // 所有Provider都无效时返回默认值(可按需修改) : ""; // 将结果拼接到StringBuilder的第6列位置 sb.append(targetBusinessUnit);
方案2:Optional链式调用(Java 8+ 推荐)
用Java 8引入的Optional简化逻辑,代码可读性更强:
String targetBusinessUnit = Optional.ofNullable(provider1) .map(Provider::getBusinessUnit) .filter(bu -> bu != null && !bu.trim().isEmpty()) .orElseGet(() -> Optional.ofNullable(provider2) .map(Provider::getBusinessUnit) .filter(bu -> bu != null && !bu.trim().isEmpty()) .orElseGet(() -> Optional.ofNullable(provider3) .map(Provider::getBusinessUnit) .filter(bu -> bu != null && !bu.trim().isEmpty()) .orElse(""))); sb.append(targetBusinessUnit);
关键说明
- 必须同时验证Provider对象非空和BusinessUnit非空且非空白,避免空指针异常或无效值
- 把逻辑提取到单独变量中,而非直接在
sb.append()里写复杂表达式,能有效避免语法错误,也便于调试 - 两种方案都严格遵循“Provider1优先,其次Provider2,最后Provider3”的优先级规则
内容的提问来源于stack exchange,提问作者KeceyManis
相关产品推荐
相关产品推荐

