-
Notifications
You must be signed in to change notification settings - Fork 460
CollectionUtils
Library of generic, type safe collection methods.
Group Collection Recipes
This is a generic, reusable but still typesafe method for generating a Map<Id, Some_SObject> from a list. This code is intended to prevent developers from writing countless for loops just to transform a list of sobjects into a map where the key is something other than the object's Id field.
In order to maintain type safety, this accepts a generic list of sObjects. It then determines the concrete sObject type of the incoming lists' first object. This is used to create a new map of type Map<Id, firstItemsType> However, to maintain the generic nature of this, that concretely typed map is cast to a Map<id, sObject>. We then use generic sObject methods of .get() and .set() to construct the map.
This works for two reasons:
- Because we can always go from a concrete type, say
Account
to the generic sObject type - When you construct a concrete object but cast it to an sObject, even in a map context, the concrete sObject type is not lost.
public static Map<Id,SObject> idMapFromCollectionByKey(String key, List<SObject> incomingList)
Name | Type | Description |
---|---|---|
key | String | String representation of the field name to use as the Key. |
This must be of type Id for this method. | ||
incomingList | List<SObject> | Any list of objects that can be cast to a list of |
sObjects |
Map<Id,SObject>
Contact[] contacts = [SELECT AccountId, firstName, lastName FROM Contact LIMIT 50];
Map<Id, Contact> contactsByAccountId = (Map<Id, Contact>) CollectionUtils.idMapFromCollectionByKey('accountId', contacts);
Method functions as the above methods do, but returns a map whose keys are strings. The key parameter here must be something castable to string. Note, you are responsible for ensuring the uniqueness of the key's value when using this.
public static Map<String,SObject> stringMapFromCollectionByKey(String key, List<SObject> incomingList)
Name | Type | Description |
---|---|---|
key | String | String field name of a field who's value is castable to String. |
incomingList | List<SObject> | List of incoming sObjects to build the map from |
Map<String,SObject>
Contact[] contacts = [SELECT AccountId, firstName, lastName FROM Contact LIMIT 50];
Map<String, Contact> contactsByAccountId = (Map<String, Contact>) CollectionUtils.stringMapFromCollectionByKey('shippingStreet', contacts);
This method accepts an incoming List of sObjects and generates a Map<id,List<sObject>>. Useful for not littering your codebase full of for loops to, for instance, take a list of Contacts and get a Map of AccountIds to a List<Contacts>.
public static Map<Id,List<SObject>> mapFromCollectionWithCollectionValues(String key, List<SObject> incomingList)
Name | Type | Description |
---|---|---|
key | String | String name of an field that is of the ID type. |
incomingList | List<SObject> | List of sObjects to build the map from. |
Map<Id,List<SObject>>
Contact[] contacts = [SELECT AccountId, firstName, lastName FROM Contact LIMIT 50];
Map<Id, List<Contact>> contactsByAccountId = (Map<Id, List<Contact>>) CollectionUtils.mapFromCollectionWithCollectionValues('accountId', contacts);
private static String getSobjectTypeFromList(List<SObject> incomingList)
Name | Type | Description |
---|---|---|
incomingList | List<SObject> |
String