DEV Community

francesco agati
francesco agati

Posted on

Extending Iterable for Custom Aggregations in Dart

Dart is a powerful programming language that allows developers to extend the functionality of existing classes using extension methods. This feature can be incredibly useful when you want to add custom aggregations and operations to the Iterable class. In this article, we'll explore how to extend Iterable with custom aggregation methods for summing, finding the maximum value, and finding the minimum value.

Adding Custom Aggregations to Iterable

We will create an extension called IterableExtensions that adds three methods to Iterable:

  1. sum: Computes the sum of the elements based on a provided function.
  2. maxBy: Finds the maximum element based on a provided comparison function.
  3. minBy: Finds the minimum element based on a provided comparison function.

Here is the Dart code for the extension:

extension IterableExtensions<T> on Iterable<T> {
  num sum(num Function(T) f) {
    return fold(0, (previous, element) => previous + f(element));
  }

  T? maxBy(Comparable Function(T) f) {
    return isEmpty ? null : reduce((a, b) => f(a).compareTo(f(b)) >= 0 ? a : b);
  }

  T? minBy(Comparable Function(T) f) {
    return isEmpty ? null : reduce((a, b) => f(a).compareTo(f(b)) <= 0 ? a : b);
  }
}
Enter fullscreen mode Exit fullscreen mode

Method Breakdown

  • sum: This method takes a function f that maps each element to a num value. It uses the fold method to iterate through the elements, accumulating their sum.
  • maxBy: This method takes a function f that returns a Comparable value for each element. It uses the reduce method to find the element with the maximum value based on the comparison function.
  • minBy: This method is similar to maxBy, but it finds the element with the minimum value.

Usage Examples

Let's see how these extension methods can be used in practice:

void main() {
  var items = [1, 2, 3, 4, 5];
  print(items.sum((x) => x));            // Output: 15
  print(items.maxBy((x) => x));          // Output: 5
  print(items.minBy((x) => x));          // Output: 1

  var strings = ["apple", "banana", "cherry"];
  print(strings.maxBy((s) => s.length)); // Output: "banana"
  print(strings.minBy((s) => s.length)); // Output: "apple"
}
Enter fullscreen mode Exit fullscreen mode

Explanation

  • Summing Elements: The sum method is used on a list of integers to calculate the total sum. In this case, it sums up to 15.
  • Finding Maximum and Minimum Values: The maxBy and minBy methods are used to find the maximum and minimum elements in a list based on the value itself for integers and based on the string length for strings.

Benefits of Extension Methods

Using Dart's extension methods, you can add functionality to existing classes and types in a way that is both expressive and easy to read. This approach allows you to write cleaner and more maintainable code by encapsulating common operations and making them available directly on the Iterable interface.

In conclusion, extending Iterable with custom aggregation methods can greatly enhance the expressiveness of your Dart code. By using the provided sum, maxBy, and minBy methods, you can perform complex operations in a concise and readable manner. This makes your code not only easier to write but also easier to understand and maintain.

Top comments (0)