Dart API Referencedart:coreimplCollections

Collections class

The Collections class implements static methods useful when writing a class that implements Collection and the iterator method.

class Collections {
  static bool contains(Iterable iterable, var element) {
    for (final e in iterable) {
      if (element == e) return true;
    }
    return false;
  }

  static void forEach(Iterable iterable, void f(o)) {
    for (final e in iterable) {
      f(e);
    }
  }

  static bool some(Iterable iterable, bool f(o)) {
    for (final e in iterable) {
      if (f(e)) return true;
    }
    return false;
  }

  static bool every(Iterable iterable, bool f(o)) {
    for (final e in iterable) {
      if (!f(e)) return false;
    }
    return true;
  }

  static List map(Iterable source, List destination, f(o)) {
    for (final e in source) {
      destination.add(f(e));
    }
    return destination;
  }

  static Dynamic reduce(Iterable iterable,
                        Dynamic initialValue,
                        Dynamic combine(Dynamic previousValue, element)) {
    for (final element in iterable) {
      initialValue = combine(initialValue, element);
    }
    return initialValue;
  }

  static List filter(Iterable source, List destination, bool f(o)) {
    for (final e in source) {
      if (f(e)) destination.add(e);
    }
    return destination;
  }

  static bool isEmpty(Iterable iterable) {
    return !iterable.iterator().hasNext();
  }

  // TODO(jjb): visiting list should be an identityHashSet when it exists

  /**
   * Returns a string representing the specified collection. If the
   * collection is a [List], the returned string looks like this:
   * [:'[element0, element1, ... elementN]':]. The value returned by its
   * [toString] method is used to represent each element. If the specified
   * collection is not a list, the returned string looks like this:
   * [:{element0, element1, ... elementN}:]. In other words, the strings
   * returned for lists are surrounded by square brackets, while the strings
   * returned for other collections are surrounded by curly braces.
   *
   * If the specified collection contains a reference to itself, either
   * directly or indirectly through other collections or maps, the contained
   * reference is rendered as [:'[...]':] if it is a list, or [:'{...}':] if
   * it is not. This prevents the infinite regress that would otherwise occur.
   * So, for example, calling this method on a list whose sole element is a
   * reference to itself would return [:'[[...]]':].
   *
   * A typical implementation of a collection's [toString] method will
   * simply return the results of this method applied to the collection.
   */
  static String collectionToString(Collection c) {
    var result = new StringBuffer();
    _emitCollection(c, result, new List());
    return result.toString();
  }

  /**
   * Appends a string representing the specified collection to the specified
   * string buffer. The string is formatted as per [collectionToString].
   * The [:visiting:] list contains references to all of the enclosing
   * collections and maps (which are currently in the process of being
   * emitted into [:result:]). The [:visiting:] parameter allows this method to
   * generate a [:'[...]':] or [:'{...}':] where required. In other words,
   * it allows this method and [_emitMap] to identify recursive collections
   * and maps.
   */
  static void _emitCollection(Collection c, StringBuffer result, List visiting) {
    visiting.add(c);
    bool isList = c is List;
    result.add(isList ? '[' : '{');

    bool first = true;
    for (var e in c) {
      if (!first) {
        result.add(', ');
      }
      first = false;
      _emitObject(e, result, visiting);
    }

    result.add(isList ? ']' : '}');
    visiting.removeLast();
  }

  /**
   * Appends a string representing the specified object to the specified
   * string buffer. If the object is a [Collection] or [Map], it is formatted
   * as per [collectionToString] or [mapToString]; otherwise, it is formatted
   * by invoking its own [toString] method.
   *
   * The [:visiting:] list contains references to all of the enclosing
   * collections and maps (which are currently in the process of being
   * emitted into [:result:]). The [:visiting:] parameter allows this method
   * to generate a [:'[...]':] or [:'{...}':] where required. In other words,
   * it allows this method and [_emitCollection] to identify recursive maps
   * and collections.
   */
  static void _emitObject(Object o, StringBuffer result, List visiting) {
    if (o is Collection) {
      if (_containsRef(visiting, o)) {
        result.add(o is List ? '[...]' : '{...}');
      } else {
        _emitCollection(o, result, visiting);
      }
    } else if (o is Map) {
      if (_containsRef(visiting, o)) {
        result.add('{...}');
      } else {
        Maps._emitMap(o, result, visiting);
      }
    } else { // o is neither a collection nor a map
      result.add(o);
    }
  }

  /**
   * Returns true if the specified collection contains the specified object
   * reference.
   */
  static _containsRef(Collection c, Object ref) {
    for (var e in c) {
      if (e === ref) return true;
    }
    return false;
  }
}

Static Methods

bool contains(Iterable iterable, element) #

static bool contains(Iterable iterable, var element) {
  for (final e in iterable) {
    if (element == e) return true;
  }
  return false;
}

void forEach(Iterable iterable, void f(o)) #

static void forEach(Iterable iterable, void f(o)) {
  for (final e in iterable) {
    f(e);
  }
}

bool some(Iterable iterable, bool f(o)) #

static bool some(Iterable iterable, bool f(o)) {
  for (final e in iterable) {
    if (f(e)) return true;
  }
  return false;
}

bool every(Iterable iterable, bool f(o)) #

static bool every(Iterable iterable, bool f(o)) {
  for (final e in iterable) {
    if (!f(e)) return false;
  }
  return true;
}

List map(Iterable source, List destination, f(o)) #

static List map(Iterable source, List destination, f(o)) {
  for (final e in source) {
    destination.add(f(e));
  }
  return destination;
}

reduce(Iterable iterable, initialValue, combine(previousValue, element)) #

static Dynamic reduce(Iterable iterable,
                      Dynamic initialValue,
                      Dynamic combine(Dynamic previousValue, element)) {
  for (final element in iterable) {
    initialValue = combine(initialValue, element);
  }
  return initialValue;
}

List filter(Iterable source, List destination, bool f(o)) #

static List filter(Iterable source, List destination, bool f(o)) {
  for (final e in source) {
    if (f(e)) destination.add(e);
  }
  return destination;
}

bool isEmpty(Iterable iterable) #

static bool isEmpty(Iterable iterable) {
  return !iterable.iterator().hasNext();
}

String collectionToString(Collection c) #

Returns a string representing the specified collection. If the collection is a List, the returned string looks like this: '[element0, element1, ... elementN]'. The value returned by its toString method is used to represent each element. If the specified collection is not a list, the returned string looks like this: {element0, element1, ... elementN}. In other words, the strings returned for lists are surrounded by square brackets, while the strings returned for other collections are surrounded by curly braces.

If the specified collection contains a reference to itself, either directly or indirectly through other collections or maps, the contained reference is rendered as '[...]' if it is a list, or '{...}' if it is not. This prevents the infinite regress that would otherwise occur. So, for example, calling this method on a list whose sole element is a reference to itself would return '[[...]]'.

A typical implementation of a collection's toString method will simply return the results of this method applied to the collection.

static String collectionToString(Collection c) {
  var result = new StringBuffer();
  _emitCollection(c, result, new List());
  return result.toString();
}