[SalesForce] Use of Maps instead of For loop

Can somebody help me to use MAPs instead of for loops. My below code is having a query on User object. In Users having Related_Team__c -'Operation' there is related_BDE__C, service_segment__c, both are multi-select picklists. Whenever a BDE changes a Opportunity stage to 'Closed Won' an Operation (a custom object) record is made.
Operation User and BDE user are related to service_Segment. e.g if service segment of Opportunity is 'Company Registration' than only Operation user having a Company Registration in there service_segment__c field is entitled to become the owner of that operation record. And also BDE user should be in Operation User BDE list. Now I am picking the service segment and BDE user so that I can find which Operation user is entitled to have its Operation record.

The code is bit more lengthy if any body like to have complete code I will modify it.

map<String, map<String, list<string>>> relativeOPEBDE = new map<String, map<String, list<string>>>();
list<String> relatedBDEs = new List<String>();
list<String> servSegments = new List<String>();
list<User> tempUser = [SELECT firstname, lastname, Related_BDE__c, Related_Team__c,Service_Segment__c, id 
                       FROM User 
                       WHERE isactive = true 
                       AND On_Leave__c = false 
                       ORDER BY Related_Team__c ASC];

for(User tempUsers : tempUser) {
    systemUserInfo.put(tempUsers.firstname.toLowerCase() + ' ' + tempUsers.lastname.toLowerCase(), tempUsers.id);  
    system.debug('Related Team values ---- ' + tempUsers);

    if (tempUsers.Related_BDE__c != null     && 
        tempUsers.Related_BDE__c != ''       && 
        tempUsers.Service_Segment__c != null &&
        tempUsers.Service_Segment__c != ''      ){

            servSegments = tempUsers.Service_Segment__c.split(';'); 
            relatedBDEs = tempUsers.Related_BDE__c.split(';'); 

            system.debug('--related BDE--'+ relatedBDEs);
            if (relatedBDEs.size() > 0 && servSegments.size() > 0) {
                for (String tempString : relatedBDEs) {
                    tempString = tempString.toLowerCase();  
                    system.debug('tempString values are ----' + tempString);
                    system.debug('--Service Segments--'+ servSegments + '--operation SS--' + serviceSegment);

                    for (String tempSegment : servSegments) {
                        //for(Operation__c tempOperation : trigger.new)
                            //tempSegment = tempSegment.toLowerCase();  
                        system.debug('tempSegment values are ----' + tempSegment);
                        if (tempSegment != null
                            && tempUsers.Related_Team__c == 'Operation') {
                            system.debug('--operationTeam--'+ operationTeam);
                            if (tempSegment == 'Company Registration'
                                || tempSegment == 'LLP Registration') { 
                                    /*
                                    if(tempOperation.Service_Segment__c == 'Company Registration'
                                        || tempOperation.Service_Segment__c == 'LLP Registration')
                                    */  
                                system.debug('--coming here in if--'+ tempSegment);
                                if(operationTeam.containsKey(tempSegment)){

                                    relativeOPEBDE.get(tempSegment).get(systemUserInfo.get(tempString)).add(tempUsers.id);
                                    system.debug('--relativeOPEBDE--' + relativeOPEBDE);
                                }else { 
                                    relativeOPEBDE.put(tempSegment, new map<string, list<string>>{systemUserInfo.get(tempString)=> new list<String>{tempUsers.id}});
                                    system.debug('--relativeOPEBDE--' + relativeOPEBDE);
                                }   
                                system.debug('--Company Registration--' + operationTeam);

                            } 
                            else if(tempSegment == 'Compliance Services') {

                                //if(tempOperation.Service_Segment__c == 'Compliance Services')
                                system.debug('--coming her in ist else if--'+ tempSegment );
                                if(operationTeam.containsKey(tempSegment)){
                                    operationTeam.get(tempSegment).add(tempUsers.id);
                                }else { 
                                    operationTeam.put(tempSegment, new List<String> {tempUsers.id});
                                }   
                                system.debug('--Compliance Services--' + operationTeam);
                            } 
                            else if(tempSegment == 'IPR Services'){
                                //if(tempOperation.Service_Segment__c == 'IPR Services')
                                system.debug('--coming her in 2nd else if--'+ tempSegment );
                                if(operationTeam.containsKey(tempSegment)){
                                    operationTeam.get(tempSegment).add(tempUsers.id);
                                }else { 
                                    operationTeam.put(tempSegment, new List<String> {tempUsers.id});
                                }   
                                system.debug('--IPR Services--' + operationTeam);
                            }  
                        } 
                    }
                }   
            }
        }   
    }

Here in above code I have already use 3 for loops and I want to use another loop. But I know it is not a good practice to use so many loops and also we can use MAPs instead of for loops. Please help me to reduce code line.

Best Answer

This is something of a guess as the code is not too easy to follow so please use your own judgement on its relevance to your problem.

Your code looks trigger-related, and with triggers it is important that they do as little work as possible. So a trigger would usually start with this sort of loop (rather than have it in the middle as in your code):

for(Operation__c tempOperation : trigger.new)

and just gather the unique values (of e.g. Service_Segment__c) into a map or set.

There would then follow (if the map or set is not empty) the query of the User object using a where clause that is selective as possible and so adds something like this to what you already have:

Service_Segment__c includes :segments
and/or
Related_BDE__c includes :bdes 

And it is inside this second loop that you would include your logic, adding any resulting values into further maps or sets.

If any updates or inserts are needed, these would then be done in a third step.

So overall execution time is proportional to the number of objects rather than growing exponentially (as typically happens where loops are nested within loops).

Related Topic