#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:
Вот несколько альтернатив:
- Добавьте их в список и войдите в систему позже.
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")
}
- Разделите свой список на допустимые и недопустимые значения. Регистрируйте недействительные и обрабатывайте хорошие.
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. Объявите список перед циклом, а не внутри него.