Как я могу сделать эту функцию функциональным способом программирования?

Как бы я превратил эту функцию в чистую функцию (функциональное программирование)?

fun validateOffer(offerValidateRequest: OfferValidateRequest, channelId: ChannelId, tenant: Tenant): OfferValidateRepresentation { val errorsList = mutableListOf<OfferValidateErrorsRepresentation>() val successList = mutableListOf<OfferValidateSuccessRepresentation>() offerValidateRequest.offers.forEach { val filterRequest = OfferGetRequest(it.id, it.type) val catalogs = findCatalogsWithOffers(filterRequest, channelId, tenant) val errorMessages = getOfferErrorMessages(it, catalogs, filterRequest) if (errorMessages.isEmpty()) { successList.add(OfferValidateSuccessRepresentation(it.id, it.type)) } else { errorsList.add(OfferValidateErrorsRepresentation(it.id, it.type, errorMessages)) } } return OfferValidateRepresentation(errorsList, successList) } 

Мне не очень нравятся эти итерации в списках ошибок и успехов.

На самом деле ваша функция уже чиста. Не имеет побочных эффектов.

Но вы все равно можете избежать измененных списков, используя объявление карты, раздела и объявления деструкции пары .

Если я заменил цикл for на функциональные операции, я попытаюсь использовать несколько карт, фильтров, flatMaps. Самое приятное в этом заключается в том, что между этими операциями доступны только общие данные, это коллекция, которую вы проходите.

 val (successList, errorsList) = offerValidateRequest.offers.map { val filterRequest = OfferGetRequest(it.id, it.type) val catalogs = findCatalogsWithOffers(filterRequest, channelId, tenant) val errorMessages = getOfferErrorMessages(it, catalogs, filterRequest) Pair(it, errorMessages) }.partition { it.second.isEmpty() } return OfferValidateRepresentation( errorsList.map { OfferValidateErrorsRepresentation(it.first.id, it.first.type, it.second.errorMessages) }, successList.map { OfferValidateSuccessRepresentation(it.first.id, it.first.type) } )