Skip to content

ipavlic/apex-fp

Repository files navigation

Apex FP

CI workflow codecov

Apex FP provides functional constructs for SObject collections!

Read the documentation

Apex FP documentation

Deploy to Salesforce

Deploy to Salesforce

Examples

Filter

List<Opportunity> largeOpportunities = SObjectCollection.of(opportunities)
	.filter(Fn.Match
		.field(Opportunity.Amount).greaterThan(150000)
		.also(Opportunity.AccountId).equals(accountId))
	.asList();

Map

List<Task> prospectingOpportunityTasks = SObjectCollection.of(Trigger.new)
	.filter(Fn.Match.recordFields(new Opportunity(Stage = 'Prospecting')))
	.mapAll(Fn.MapTo(Task.SObjectType)
		.setField(Task.Subject, 'Follow up')
		.mapField(Task.WhatId, Opportunity.Id))
	.asList();
List<Task> largeProspectingOpportunityFollowUpTasks = SObjectCollection.of(Trigger.new)
	.filter(Fn.Match.recordFields(new Opportunity(Stage = 'Prospecting')))
	.mapSome(
		Fn.Match.field(Opportunity.Amount).greaterThan(100000),
		Fn.MapTo(Task.SObjectType)
			.setField(Task.Subject, 'Follow up')
			.mapField(Task.WhatId, Opportunity.Id)
	)
	.asList();

Modify

List<Opportunity> largeOpportunities = SObjectCollection.of(opportunities)
	.forEach(Fn.Modify
		.setField(Opportunity.Rank__c, 'Excellent')
	)
	.asList();

Group

Map<Id, List<Account>> accountsByParentId = SObjectCollection.of(accounts).groupByIds(Account.ParentId);

Pick

List<Opportunity> idAndAmountOpportunities = SObjectCollection.of(opportunities)
	.pick(new Set<Schema.SObjectField>{Opportunity.Id, Opportunity.Amount})
	.asList();

Pluck

List<Decimal> amounts = SObjectCollection.of(opportunities).pluckDecimals(Opportunity.Amount);

Average

OptionalDecimal average = SObjectCollection.of(opportunities).mapToDecimal(Opportunity.Amount).average();

Sum

OptionalDecimal sum = SObjectCollection.of(opportunities).mapToDecimal(Opportunity.Amount).sum();

Min

OptionalDecimal min = SObjectCollection.of(opportunities).mapToDecimal(Opportunity.Amount).min();

Max

OptionalDecimal max = SObjectCollection.of(opportunities).mapToDecimal(Opportunity.Amount).max();