как зарегистрировать только одно сообщение об ошибке в строке, а не несколько сообщений об ошибке для моего кода

#kotlin

Вопрос:

внутри списка configTypeBuilderList есть несколько элементов, если значение в атрибутах правил не совпадает с полем назначения в ConfigTypeBuilder, оно зарегистрирует ошибку

 ruleCriteriaList.forEach { configRuleCriteria ->

    validateConfigTypeBuilder(configRuleCriteria.configTypeBuilderList, ruleAttributesNames)
}

private fun validateConfigTypeBuilder(configTypeBuilderList: List<ConfigTypeBuilder>, ruleAttributes: List<String>) {
  val missAttributeList: MutableList<String> = mutableListOf()

  configTypeBuilderList.forEach { configTypeBuilder ->
    if(configTypeBuilder!= null) {
    if (ruleAttributes.firstOrNull { ruleAttribute -> ruleAttribute == configTypeBuilder.destinationField } == null) {
      
      if(!ruleAttributes.contains(configTypeBuilder.destinationField)) {
           missAttributeList.add(configTypeBuilder.destinationField)
       }
       logger.error("{} is wrong", configTypeBuilder.destinationField)
     }
  } 

}
 

Проблема в том, что каждый раз, когда только один элемент(configTypeBuilderList) переходит в validateConfigTypeBuilder, регистратор показывает следующее

 logger.error("field1 is wrong")
logger.error("field2 is wrong")
...

 

Что мне нужно, так это как я могу изменить свой код, чтобы сделать это?

 logger.error("field1, field2, field3 are wrong")

 

Редактировать

Я попробовал первое решение, но застрял здесь, я все равно получаю тот же результат ошибки, причина в том, что каждый раз, когда есть только одно «Поле назначения», как я могу сделать так, чтобы в списке было все поле ошибки, а затем зарегистрировать ошибку, могу ли я использовать continue или что-то в этом роде?

Ответ №1:

Вот несколько альтернатив:

  1. Добавьте их в список и войдите в систему позже.
 fun foo()
     val incorrectItems = mutableListOf<Any>()

     // Do some stuff
     
     // on error:
     incorrectItems.add(someIncorrectItem)

     // Do more stuff

     // log the accumulated errors:
     logger.error("${incorrectItems.joinToString("")} are wrong")
}
 
  1. Разделите свой список на допустимые и недопустимые значения. Регистрируйте недействительные и обрабатывайте хорошие.
 fun foo(someList: List<MyClass>) {
    val (goodItems, badItems) = someList.partition { it.isValid() } 
    // ...where isValid() is whatever code you need to check is OK.
    
    if (badItems.isNotEmpty()) {
        logger.error("${badItems.joinToString("")} are wrong")
    }

    // Do stuff with goodItems
}
 

Комментарии:

1. Объявите список перед циклом, а не внутри него.