2017-11-24 5 views
-1

Wie würde ich diese Funktion in eine reine Funktion (funktionale Programmierung) machen?Wie kann ich diese Funktion in einer funktionalen Programmierweise machen?

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) 
} 

Ich bin nicht sehr wohl mit diesen Iterationen in den Listen der Fehler und Erfolge.

Antwort

1

Eigentlich ist deine Funktion schon rein. Es hat keine Nebenwirkungen.

Aber Sie könnten die veränderbaren Listen immer noch vermeiden, indem Sie map, partition und eine pair Destrukturierungserklärung verwenden.

Wenn ich eine for-Schleife durch funktionale Operationen ersetzen, versuche ich mehrere Karten, Filter, flatMaps zu verwenden. Das Schöne daran ist, dass zwischen diesen Operationen die einzigen gemeinsamen Daten die Sammlung sind, die Sie durchlaufen.

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) } 
) 
Verwandte Themen