如何修改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
相关产品推荐
相关产品推荐

