Java中无需转String检查Map内字段空值的优化方案咨询
问题
从数据库查询数据并转换为List<Map>后,需要实现以下逻辑:如果Map中noc032(对应业务中的A4字段)非空,直接返回该值;否则返回A1、A2、A3对应字段(对应查询中的no032、ap1032、ap2032)的拼接结果。
当前实现是通过Objects.toString()将字段值转为字符串后,用StringUtils.isBlank()检查空值,希望找到无需先转换为String的更优实现方式。
现有SQL查询语句
String query = "select gactb021.des021, " + " gactb032.nif032, gactb032.noc032, gactb032.no032,gactb032.ap1032, gactb032.ap2032, " + " sdt031.facto, sdt031.cprof, sdt031.ipago from sdt031 " + " INNER JOIN GACTB021 ON sdt031.cacto = GACTB021.act021 " + " INNER JOIN GACTB032 ON sdt031.cprof = GACTB032.fact032 " + " where NASET = VARIABLE1" + " and FACTO <= VARIABLE2 AND FACTO >= VARIABLE3" + " AND (SPAGE = 'R' OR SPAGE = 'M' OR SPAGE = 'F')";
当前Java实现代码
private static String formatNomFact(Map elements) { String issueVar = Objects.toString(elements.get("noc032"), ""); if(StringUtils.isBlank(issueVar)) { // 拼接no032、ap1032、ap2032的逻辑 } else { // 返回noc032的逻辑 } return ""; }
优化实现方案
方案1:直接判断原始字段值(无需转String)
直接从Map中取出noc032的原始值,先判断是否为null,再针对字符串类型判断是否为空串:
private static String formatNomFact(Map<String, Object> elements) { Object noc032 = elements.get("noc032"); // 双重判断:先排除null,再排除空字符串(兼容数据库返回空串的情况) if (noc032 == null || (noc032 instanceof String && ((String) noc032).isEmpty())) { // 拼接A1、A2、A3字段 StringBuilder sb = new StringBuilder(); appendIfNotNull(sb, elements.get("no032")); appendIfNotNull(sb, elements.get("ap1032")); appendIfNotNull(sb, elements.get("ap2032")); return sb.toString(); } else { // 直接返回原始值的字符串形式 return noc032.toString(); } } // 提取工具方法简化拼接逻辑 private static void appendIfNotNull(StringBuilder sb, Object obj) { if (obj != null) { sb.append(obj); } }
方案2:用工具类直接判断原始对象
利用StringUtils.isBlank()的重载方法(支持CharSequence类型),无需提前转换为String:
private static String formatNomFact(Map<String, Object> elements) { Object noc032 = elements.get("noc032"); // 先判断null,再用工具类判断空串/空白串 if (noc032 == null || StringUtils.isBlank((CharSequence) noc032)) { StringBuilder sb = new StringBuilder(); appendIfNotNull(sb, elements.get("no032")); appendIfNotNull(sb, elements.get("ap1032")); appendIfNotNull(sb, elements.get("ap2032")); return sb.toString(); } else { return noc032.toString(); } } private static void appendIfNotNull(StringBuilder sb, Object obj) { if (obj != null) { sb.append(obj); } }
方案3:SQL层面提前处理(推荐)
如果业务允许,直接在SQL中完成逻辑判断,减少Java代码的处理成本:
select gactb021.des021, gactb032.nif032, -- SQL内实现逻辑:noc032非空则取它,否则拼接三个字段 CASE WHEN gactb032.noc032 IS NOT NULL AND TRIM(gactb032.noc032) <> '' THEN gactb032.noc032 ELSE CONCAT(gactb032.no032, gactb032.ap1032, gactb032.ap2032) END AS display_name, gactb032.no032, gactb032.ap1032, gactb032.ap2032, sdt031.facto, sdt031.cprof, sdt031.ipago from sdt031 INNER JOIN GACTB021 ON sdt031.cacto = GACTB021.act021 INNER JOIN GACTB032 ON sdt031.cprof = GACTB032.fact032 where NASET = VARIABLE1 and FACTO <= VARIABLE2 AND FACTO >= VARIABLE3 AND (SPAGE = 'R' OR SPAGE = 'M' OR SPAGE = 'F');
此时Java代码只需直接取预处理好的字段:
private static String formatNomFact(Map<String, Object> elements) { return Objects.toString(elements.get("display_name"), ""); }
内容的提问来源于stack exchange,提问作者Grismak
相关产品推荐
相关产品推荐

