As a developer most of the times we will be working on collections.One of the most common used collection in salesforce is maps.
Creating a simple maps(value as a string,integer,object etc..) is very easy
OutPut:
Please watch this space more useful stuff.
Please follow,bookmark,subscribe this site to receive daily updates.
Facebook - https://www.facebook.com/ILoveCodingYou/?ref=bookmarks
Creating a simple maps(value as a string,integer,object etc..) is very easy
- Map<String,String>
- Map<String,Integer>
- Map<key,objects>
The real picture comes into scenario when we want to build some complex maps(where value of a map it self again a collection like list,set etc)
- Map<String,list<Account>>
- Map<integer,set<integer>>
- Map<AccountId,list<Conatct>>
Most common mistakes that we do while building this complex maps are
- Old value gets overrides by new values.
- When your in loop you map always ends up with just holding the last record in list/set.
- Didn't checking whether value is already is exist or not.
Scenario:
Let take a take I want to create a map which will takes case status as key and it's value is all the cases comes under the same status.
Map<String,List<Case>> mapStatusToCases = new Map<String,List<Case>>() for( Case cs: [SELECT id,Status,CaseNumber FROM Case limit 20]) { //Check whether with same status any record is already is added to map or not if(mapStatusToCases.containsKey(cs.Status)) { // If you directly put this case into the map it will overrides all the existing cases, // which is not correct.So get all the existing records and store it list/set. List<Case> existingCase = mapStatusToCases.get(cs.Status); //add this new record to existing list existingCase.add(cs); // now put the same status into the map with all latest case records(existing+new), // because key is same so it will overrides existing values with this latest list mapStatusToCases.put(cs.Status,existingCase); } else // this executes if the status is not there in map(it means coming first time) { //prepare variable of map value type List<case> lstNewCases = new List<Case>(); // adding a new record lstNewCases.add(cs); // add the new status as a key and case as a value into map mapStatusToCases.put(cs.Status,lstNewCases); } } System.debug('All Key Set...'+mapStatusToCases.keySet()); System.debug('All Values in Map...'+mapStatusToCases.values()); System.debug('Complete Map Details...'+mapStatusToCases);
For better understanding in above I have written each statement in a separate line. The same code can also be written in an optimized way as shown below.Both are valid and same.
Map<String,List<Case>> mapStatusToCases = new Map<String,List<Case>>() for( Case cs: [SELECT id,Status,CaseNumber FROM Case limit 20]) { //Check whether with same status any record is already is added to map or not if(mapStatusToCases.containsKey(cs.Status)) { //this statement mapStatusToCases.get(cs.Status) will returns the list //So,I'm adding new record to existing list directly mapStatusToCases.get(cs.Status).add(cs); } else // this executes if the status is not there in map(it means coming first time) { //Delcared a new list and directly adding a new record to that mapStatusToCases.put(cs.Status,new List<Case>{cs}); } } System.debug('All Key Set...'+mapStatusToCases.keySet()); System.debug('All Values in Map...'+mapStatusToCases.values()); System.debug('Complete Map Details...'+mapStatusToCases);
OutPut:
Please watch this space more useful stuff.
Please follow,bookmark,subscribe this site to receive daily updates.
Facebook - https://www.facebook.com/ILoveCodingYou/?ref=bookmarks
Hope this helps you..Enjoy..!
No comments:
Post a Comment