2017-11-24 16 views
-1

この関数を純関数(関数型プログラミング)にするにはどうすればよいですか?関数型プログラミングでこの関数を作成するにはどうすればよいですか?

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

エラーや成功のリストでは、これらの繰り返しはあまり快適ではありません。

答えて

1

実際にあなたの機能はすでに純粋です。副作用はありません。

しかし、map、partitionpairの構造解除宣言を使用して、変更可能なリストを回避することはできます。

機能的な操作でforループを置き換えると、複数のマップ、フィルター、フラットマップを使用しようとします。これについての良い点は、これらの操作の間に共有される唯一のデータは、渡すコレクションです。

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) } 
) 
関連する問題