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

如何修改Kotlin代码实现多个不匹配字段仅输出单行错误日志

问题根因

你当前逐行打印日志的核心原因是错误字段收集列表missAttributeList的作用域错误:

  • 该列表定义在validateConfigTypeBuilder方法内部,属于局部变量,每次方法调用结束后就会被销毁
  • 每次调用该方法时传入的configTypeBuilderList仅包含1个元素,导致每次只能收集1个错误字段、打印1次日志,自然无法汇总所有错误

解决方案

核心逻辑是把错误字段收集列表的作用域提升到外层,覆盖所有ruleCriteriaList的遍历过程,等全部校验完成后统一打印日志,不需要用continue关键字也能实现,修改后的代码如下:

外层调用逻辑

// 在外层定义全局的错误字段收集列表,贯穿所有校验流程
val missAttributeList: MutableList<String> = mutableListOf()

ruleCriteriaList.forEach { configRuleCriteria ->
    // 将收集列表作为入参传入校验方法,所有错误都追加到同一个列表中
    validateConfigTypeBuilder(configRuleCriteria.configTypeBuilderList, ruleAttributesNames, missAttributeList)
}

// 全部校验完成后,统一判断打印日志
if (missAttributeList.isNotEmpty()) {
    logger.error("{} are wrong", missAttributeList.joinToString(", "))
}

校验方法逻辑

private fun validateConfigTypeBuilder(
    configTypeBuilderList: List<ConfigTypeBuilder>,
    ruleAttributes: List<String>,
    // 新增入参:全局错误收集列表
    missAttributeList: MutableList<String>
) {
    configTypeBuilderList.forEach { configTypeBuilder ->
        // 跳过空元素,等同于Java的continue
        configTypeBuilder ?: return@forEach
        val targetField = configTypeBuilder.destinationField
        // 移除原有冗余的firstOrNull判断,仅保留contains校验,同时增加去重逻辑(不需要去重可删除后半段判断)
        if (!ruleAttributes.contains(targetField) && !missAttributeList.contains(targetField)) {
            missAttributeList.add(targetField)
        }
    }
}

可选优化说明

如果允许同一个错误字段重复出现在日志中,可以去掉&& !missAttributeList.contains(targetField)的去重判断。


内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:21:00