You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:35:23