/apex-fp

Functional programming for Salesforce Apex

Primary LanguageApexMIT LicenseMIT

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();